pupil 0.0.6 → 0.1.0

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 CHANGED
@@ -1,6 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem "oauth"
4
+ gem "json"
4
5
 
5
6
  group :development do
6
7
  gem "rspec", "~> 2.3.0"
@@ -1,15 +1,16 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- diff-lcs (1.1.2)
4
+ diff-lcs (1.1.3)
5
5
  git (1.2.5)
6
6
  jeweler (1.6.4)
7
7
  bundler (~> 1.0)
8
8
  git (>= 1.2.5)
9
9
  rake
10
+ json (1.6.3)
10
11
  oauth (0.4.5)
11
- rake (0.9.2)
12
- rcov (0.9.10)
12
+ rake (0.9.2.2)
13
+ rcov (0.9.11)
13
14
  rspec (2.3.0)
14
15
  rspec-core (~> 2.3.0)
15
16
  rspec-expectations (~> 2.3.0)
@@ -26,6 +27,7 @@ PLATFORMS
26
27
  DEPENDENCIES
27
28
  bundler (~> 1.0.0)
28
29
  jeweler (~> 1.6.4)
30
+ json
29
31
  oauth
30
32
  rcov
31
33
  rspec (~> 2.3.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.6
1
+ 0.1.0
@@ -1,662 +1,20 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- require 'net/http'
4
- require 'rexml/document'
5
- require 'uri'
6
- require 'rubygems' if RUBY_VERSION < '1.9.0'
7
- require 'oauth'
8
- #require 'pp'
9
-
10
- $LOAD_PATH << File.dirname(File.expand_path(__FILE__)) if RUBY_VERSION >= '1.9.0'
11
- require 'pupil/keygen'
12
-
13
- class Pupil
14
- attr_reader :screen_name
15
- class UnsupportedParameter < StandardError; end
16
-
17
- # @param [Hash] pupil_key
18
- def initialize(pupil_key)
19
- @screen_name = pupil_key[:screen_name]
20
- @client = nil
21
- @config = nil
22
- consumer = OAuth::Consumer.new(
23
- pupil_key[:consumer_key],
24
- pupil_key[:consumer_secret],
25
- :site => 'http://api.twitter.com'
26
- )
27
- @access_token = OAuth::AccessToken.new(
28
- consumer,
29
- pupil_key[:access_token],
30
- pupil_key[:access_token_secret]
31
- )
32
- end
33
-
34
- # @param [Hash] parameter
35
- # @return [String] URL Serialized parameters
36
- def param_serializer parameter
37
- ant = Hash.new
38
- parameter.each do |key, value|
39
- case key.to_sym
40
- when :include
41
- if value.class == String || Symbol
42
- ant[:"include_#{value}"] = :true
43
- break
44
- end
45
-
46
- value.each do |element|
47
- raise UnsupportedParameter, 'include_entities is not supported.' if element.to_sym == :entities
48
- ant[:"include_#{element}"] = :true
49
- end
50
- when :exclude
51
- if value.class == String || Symbol
52
- ant[:"exclude_#{value}"] = :true
53
- break
54
- end
55
-
56
- value.each do |element|
57
- ant[:"exclude_#{element}"] = :true
58
- end
59
- else
60
- ant[key.to_sym] = value
61
- end
62
- end
63
- param = ant.inject(""){|k,v|k+"&#{v[0]}=#{v[1]}"}.sub!(/^&/,"?")
64
- return param ? param : ""
65
- end
66
-
67
- class REXML::Document
68
- def is_error?
69
- if self.root.get_text("error") then
70
- return true
71
- else
72
- return false
73
- end
74
- end
75
-
76
- def get_error_message
77
- return self.root.get_text("error")
78
- end
79
- end
80
-
81
- public
82
-
83
- # @return [Hash] User credentials
84
- def verify_credentials
85
- response = @access_token.get('/account/verify_credentials.xml')
86
- doc = REXML::Document.new(response.body)
87
- return false if doc.is_error?
88
- user = User.new(doc.elements['/user'])
89
- return user
90
- end
91
-
92
- # Alias to Pupil#home_timeline
93
- # @param [Hash] param
94
- # @return [Array] Timeline
95
- # @deprecated Use {#home_timeline} instead of this method because
96
- # is was obsoleted.
97
- def friends_timeline(param = {})
98
- param_s = param_serializer(param)
99
- begin
100
- response = @access_token.get("http://api.twitter.com/1/statuses/friends_timeline.xml"+param_s)
101
- rescue
102
- return false
103
- end
104
- doc = REXML::Document.new(response.body)
105
- return false if doc.is_error?
106
- statuses = Array.new
107
-
108
- doc.get_elements('/statuses/status').each do |element|
109
- status = Status.new(element)
110
- statuses << status
111
- end
112
-
113
- return statuses
114
- end
115
-
116
- # @param [Hash] param
117
- # @return [Array] Timeline
118
- def home_timeline(param = {})
119
- param_s = param_serializer(param)
120
- begin
121
- response = @access_token.get("http://api.twitter.com/1/statuses/home_timeline.xml"+param_s)
122
- rescue
123
- return false
124
- end
125
- doc = REXML::Document.new(response.body)
126
- return false if doc.is_error?
127
- statuses = Array.new
128
- doc.get_elements('/statuses/status').each{|element|
129
- status = Status.new(element)
130
- statuses << status
131
- }
132
- return statuses
133
- end
134
-
135
- # Returning user timeline
136
- # @param [Hash] param
137
- # @return [Hash] timeline
138
- # @option param [Fixnum] :user_id The ID of user
139
- # @option param [String] :screen_name The Screen name of user
140
- # @option param [Fixnum] :since_id
141
- # @option param [Fixnum] :max_id
142
- # @option param [Fixnum] :count
143
- # @option param [Fixnum] :page Specifies
144
- # @option param [Symbol] :trim_user
145
- # @option param [Symbol] :include #=> [:rts]
146
- # @option param [Symbol] :exclude #=> [:replies]
147
- # @option param [Symbol] :contributor_details
148
- # @example
149
- # twitter = Pupil.new PUPIL_KEY
150
- # twitter.user_timeline(:screen_name => 'o_ame', :exclude => :replies).each do |status|
151
- # puts "#{status.user.screen_name}: #{status.text}"
152
- # end
153
- def user_timeline(param = {})
154
- param_s = param_serializer(param)
155
- begin
156
- response = @access_token.get("http://api.twitter.com/1/statuses/user_timeline.xml"+param_s)
157
- rescue
158
- return false
159
- end
160
- doc = REXML::Document.new(response.body)
161
- return false if doc.is_error?
162
- statuses = Array.new
163
- doc.get_elements('/statuses/status').each{|element|
164
- status = Status.new(element)
165
- statuses << status
166
- }
167
- return statuses
168
- end
169
-
170
- # @param [Hash] param
171
- # @return [Hash] mention
172
- def mentions(param = {})
173
- param_s = param_serializer(param)
174
- begin
175
- response = @access_token.get("http://api.twitter.com/1/statuses/mentions.xml"+param_s)
176
- rescue
177
- return false
178
- end
179
- doc = REXML::Document.new(response.body)
180
- return false if doc.is_error?
181
- statuses = Array.new
182
-
183
- doc.get_elements('/statuses/status').each{|element|
184
- status = Status.new(element)
185
- statuses << status
186
- }
187
-
188
- return statuses
189
- end
190
-
191
- # Returning direct messages
192
- # @param [Hash] param
193
- # @return [Hash] directmessages
194
- def dm(param = {})
195
- param_s = param_serializer(param)
196
- begin
197
- response = @access_token.get("http://api.twitter.com/1/direct_messages.xml"+param_s)
198
- rescue
199
- return false
200
- end
201
- doc = REXML::Document.new(response.body)
202
- return false if doc.is_error?
203
- directmessages = Array.new
204
-
205
- doc.get_elements('/direct-messages/direct_message').each{|element|
206
- dm = DirectMessage.new(element)
207
- directmessages << dm
208
- }
209
-
210
- return directmessages
211
- end
212
-
213
- # Returning direct messages you sent
214
- # @param [Hash] param
215
- # @return [Hash] directmessage you sent
216
- def dm_sent(param = {})
217
- param_s = param_serializer(param)
218
- begin
219
- response = @access_token.get("http://api.twitter.com/1/direct_messages/sent.xml"+param_s)
220
- rescue
221
- return false
222
- end
223
- doc = REXML::Document.new(response.body)
224
- return false if doc.is_error?
225
- directmessages = Array.new
226
-
227
- doc.get_elements('/direct-messages/direct_message').each{|element|
228
- dm = DirectMessage.new(element)
229
- directmessages << dm
230
- }
231
-
232
- return directmessages
233
- end
234
-
235
- # Delete direct message
236
- # @param [Fixnum] dm_id message id that you want to delete
237
- # @return [Hash] response
238
- def dm_destroy(dm_id)
239
- begin
240
- response = @access_token.post("http://api.twitter.com/1/direct_messages/destroy/#{dm_id}.xml")
241
- rescue
242
- return false
243
- end
244
- return response
245
- end
246
-
247
- # Check friendships
248
- # @param [String] src source user
249
- # @param [String] dst destination user
250
- # @return [Boolean] return true if paired users have friendship, or ruturn false
251
- def friendship_exists?(src, dst)
252
- begin
253
- response = @access_token.get("http://api.twitter.com/1/friendships/exists.xml?user_a=#{src}&user_b=#{dst}")
254
- rescue
255
- return false
256
- end
257
- doc = REXML::Document.new(response.body)
258
- return false if doc.is_error?
259
- if doc.elements["friends"].text() == "true" then
260
- return true
261
- else
262
- return false
263
- end
264
- end
265
-
266
- # Follow user for screen_name
267
- # @param [String] name screen_name
268
- # @return [Hash] response
269
- def follow name
270
- begin
271
- response = @access_token.post("http://api.twitter.com/1/friendships/create/#{name}.xml")
272
- rescue
273
- return false
274
- end
275
- return response
276
- end
277
-
278
- # Unfollow user for screen_name
279
- # @param [String] name screen_name
280
- # @return [Hash] response
281
- def unfollow name
282
- begin
283
- response = @access_token.post("http://api.twitter.com/1/friendships/destroy/#{name}.xml")
284
- rescue
285
- return false
286
- end
287
- return response
288
- end
289
-
290
- # @param [Fixnum] id id
291
- # @return [Hash] response
292
- def block(id)
293
- begin
294
- response = @access_token.post("http://api.twitter.com/1/blocks/create.xml?id=#{id}")
295
- rescue
296
- return false
297
- end
298
- return response
299
- end
300
-
301
- # @param [Fixnum] id id
302
- # @return [Hash] response
303
- def unblock(id)
304
- begin
305
- response = @access_token.post("http://api.twitter.com/1/blocks/destroy.xml?id=#{id}")
306
- rescue
307
- return false
308
- end
309
- return response
310
- end
311
-
312
- # @return [Hash] list of blocking users
313
- def blocking
314
- response = @access_token.get("http://api.twitter.com/1/blocks/blocking.xml")
315
- doc = REXML::Document.new(response.body)
316
- return false if doc.is_error?
317
- users = Array.new
318
- doc.get_elements('/users/user').each{|element|
319
- user = User.new(element)
320
- users << user
321
- }
322
- return users
323
- end
324
-
325
- # @param [Fixnum] id list id
326
- # @param [String] ids id comma separated
327
- # @return [Hash] response
328
- def addlist(listid,ids)
329
- response = @access_token.post("http://api.twitter.com/1/#{@username}/#{listid}/create_all.xml?user_id=#{ids}")
330
- return response
331
- end
332
-
333
- # @return [Hash] lists
334
- def lists
335
- response = @access_token.get("http://api.twitter.com/1/#{@username}/lists.xml")
336
- doc = REXML::Document.new(response.body)
337
- return false if doc.is_error?
338
- lists = Array.new
339
- doc.get_elements('/lists_list/lists/list').each{|element|
340
- list = List.new(element)
341
- lists << list
342
- }
343
- return lists
344
- end
345
-
346
-
347
- def lists_member_create(listid,id)
348
- begin
349
- response = @access_token.post("http://api.twitter.com/1/#{@username}/#{listid}/members.xml?id=#{id}")
350
- rescue
351
- return false
352
- else
353
- return response
354
- end
355
-
356
- end
357
-
358
- def lookup(param = [])
359
- param_s = param.join(",")
360
- begin
361
- response = @access_token.get("http://api.twitter.com/1/users/lookup.xml?user_id="+param_s)
362
- rescue
363
- return false
364
- end
365
- doc = REXML::Document.new(response.body)
366
- return false if doc.is_error?
367
- users = Array.new
368
- doc.get_elements('/users/user').each{|element|
369
- user = User.new(element)
370
- users << user
371
- }
372
-
373
- return users
374
- end
375
-
376
- def friends_ids(name)
377
- begin
378
- response = @access_token.get("http://api.twitter.com/1/friends/ids/#{name}.xml")
379
- rescue
380
- return false
381
- end
382
- doc = REXML::Document.new(response.body)
383
- return false if doc.is_error?
384
- ids = Array.new
385
-
386
- doc.get_elements('/ids/id').each{|element|
387
- ids << element.text()
388
- }
389
-
390
- return ids
391
- end
392
-
393
- def followers_ids(name)
394
- begin
395
- response = @access_token.get("http://api.twitter.com/1/followers/ids/#{name}.xml")
396
- rescue
397
- return false
398
- end
399
- doc = REXML::Document.new(response.body)
400
- if doc.is_error? then
401
- return doc.get_error_message
402
- end
403
- ids = Array.new
404
-
405
- doc.get_elements('/ids/id').each{|element|
406
- ids << element.text()
407
- }
408
-
409
- return ids
410
- end
411
-
412
- def rate_limit
413
- begin
414
- response = @access_token.get("http://api.twitter.com/1/account/rate_limit_status.xml")
415
- rescue
416
- return false
417
- end
418
- doc = REXML::Document.new(response.body)
419
- return false if doc.is_error?
420
- limit = doc.get_elements('/hash/hourly-limit').shift.text()
421
-
422
- return limit
423
- end
424
-
425
- def update(status,irt='')
426
- begin
427
- response = @access_token.post(
428
- 'http://api.twitter.com/1/statuses/update.json',
429
- 'status'=> status,
430
- 'in_reply_to_status_id' => irt
431
- )
432
- rescue
433
- return false
434
- end
435
- return response
436
- end
437
-
438
- def destroy(status_id)
439
- begin
440
- response = @access_token.post("http://api.twitter.com/1/statuses/destroy/#{status_id}.xml")
441
- rescue
442
- return false
443
- end
444
- return response
445
- end
446
-
447
- def update_location(location='')
448
- location = URI.escape(location)
449
- begin
450
- response = @access_token.post("http://api.twitter.com/1/account/update_location.xml?location=#{location}")
451
- rescue
452
- return false
453
- end
454
- return response
455
- end
456
-
457
- class List
458
- attr_reader :id
459
- attr_reader :name
460
- attr_reader :full_name
461
- attr_reader :slug
462
- attr_reader :description
463
- attr_reader :subscriber_count
464
- attr_reader :member_count
465
- attr_reader :uri
466
- attr_reader :following
467
- attr_reader :mode
468
- attr_reader :user
469
-
470
- def initialize(element)
471
- @id = element.elements['id'].text()
472
- @name = element.elements['name'].text()
473
- @full_name = element.elements['full_name'].text()
474
- @slug = element.elements['slug'].text()
475
- @description = element.elements['description'].text()
476
- @subscriber_count = element.elements['subscriber_count'].text()
477
- @member_count = element.elements['member_count'].text()
478
- @uri = element.elements['uri'].text()
479
- @following = element.elements['following'].text()
480
- @mode = element.elements['mode'].text()
481
- @user = User.new(element.elements['user'])
482
- end
483
- end
484
- class DirectMessage
485
- attr_reader :id
486
- attr_reader :sender_id
487
- attr_reader :text
488
- attr_reader :recipient_id
489
- attr_reader :created_at
490
- attr_reader :sender_screen_name
491
- attr_reader :recipient_screen_name
492
- attr_reader :sender
493
- attr_reader :recipient
494
-
495
- def initialize(element)
496
- @id = element.elements['id'].text()
497
- @sender_id = element.elements['sender_id'].text()
498
- @text = element.elements['text'].text()
499
- @recipient_id = element.elements['recipient_id'].text()
500
- @created_at = element.elements['created_at'].text()
501
- @sender_screen_name = element.elements['sender_screen_name'].text()
502
- @recipient_screen_name= element.elements['recipient_screen_name'].text()
503
- @sender = User.new(element.elements['sender'])
504
- @recipient = User.new(element.elements['recipient'])
505
- end
506
- end
507
- class User
508
- attr_reader :id
509
- attr_reader :name
510
- attr_reader :screen_name
511
- attr_reader :description
512
- attr_reader :url
513
- attr_reader :followers_count
514
- attr_reader :friends_count
515
- attr_reader :statuses_count
516
- attr_reader :location
517
- attr_reader :profile_image_url
518
- attr_reader :profile_background_color
519
- attr_reader :profile_background_image_url
520
- attr_reader :profile_background_tile
521
- attr_reader :profile_text_color
522
- attr_reader :profile_link_color
523
- attr_reader :profile_sidebar_fill_color
524
- attr_reader :profile_sidebar_border_color
525
- attr_reader :protected
526
- attr_reader :created_at
527
- attr_reader :favourites_count
528
- attr_reader :utc_offset
529
- attr_reader :time_zone
530
- attr_reader :notifications
531
- attr_reader :geo_enabled
532
- attr_reader :verified
533
- attr_reader :lang
534
- attr_reader :contributors_enabled
535
- attr_reader :following
536
- attr_reader :follow_request_sent
537
-
538
- def initialize(element)
539
- @id = element.elements['id'].text()
540
- @name = element.elements['name'].text()
541
- @screen_name = element.elements['screen_name'].text()
542
- @location = element.elements['location'].text()
543
- @description = element.elements['description'].text()
544
- @profile_image_url = element.elements['profile_image_url'].text()
545
- @url = element.elements['url'].text()
546
- @protected = element.elements['protected'].text()
547
- @followers_count = element.elements['followers_count'].text()
548
- @friends_count = element.elements['friends_count'].text()
549
- @profile_background_color = element.elements['profile_background_color'].text()
550
- @profile_background_image_url = element.elements['profile_background_image_url'].text()
551
- @profile_background_tile = element.elements['profile_background_tile'].text()
552
- @profile_text_color = element.elements['profile_text_color'].text()
553
- @profile_link_color = element.elements['profile_link_color'].text()
554
- @profile_sidebar_fill_color = element.elements['profile_sidebar_fill_color'].text()
555
- @profile_sidebar_border_color = element.elements['profile_sidebar_border_color'].text()
556
- @statuses_count = element.elements['statuses_count'].text()
557
- @created_at = element.elements['created_at'].text()
558
- @favourites_count = element.elements['favourites_count'].text()
559
- @utc_offset = element.elements['utc_offset'].text()
560
- @time_zone = element.elements['time_zone'].text()
561
- @notifications = element.elements['notifications'].text()
562
- @geo_enabled = element.elements['geo_enabled'].text()
563
- @verified = element.elements['verified'].text()
564
- @lang = element.elements['lang'].text()
565
- @contributors_enabled = element.elements['contributors_enabled'].text()
566
- @following = element.elements['following'].text()
567
- @follow_request_sent = element.elements['follow_request_sent'].text()
568
- end
569
- end
570
-
571
- class Status
572
- attr_reader :created_at
573
- attr_reader :id
574
- attr_reader :text
575
- attr_reader :source
576
- attr_reader :truncated
577
- attr_reader :in_reply_to_status_id
578
- attr_reader :in_reply_to_user_id
579
- attr_reader :in_reply_to_screen_name
580
- attr_reader :favorited
581
- attr_reader :user
582
- attr_reader :geo
583
- attr_reader :place
584
- attr_reader :coordinates
585
- attr_reader :contributors
586
- attr_reader :annotations
587
- attr_reader :entities
588
-
589
- def initialize(element)
590
- @created_at = element.elements['created_at'].text()
591
- @id = element.elements['id'].text()
592
- @text = element.elements['text'].text()
593
- @source = element.elements['source'].text()
594
- @truncated = element.elements['truncated'].text()
595
- @in_reply_to_status_id = element.elements['in_reply_to_status_id'].text()
596
- @in_reply_to_user_id = element.elements['in_reply_to_user_id'].text()
597
- @in_reply_to_screen_name = element.elements['in_reply_to_screen_name'].text()
598
- @favorited = element.elements['favorited'].text()
599
- @user = User.new(element.elements['user'])
600
- @geo = element.elements['geo'].text()
601
- @place = element.elements['place'].text()
602
- @coordinates = (element.elements['coordinates'].nil?) ? nil : element.elements['coordinates'].text()
603
- @contributors = (element.elements['contributors'].nil?) ? nil : element.elements['contributors'].text()
604
- @annotations = (element.elements['annotations'].nil?) ? nil : element.elements['annotations'].text()
605
- @entities = (element.elements['entities'].nil?) ? nil : Entities.new(element.elements['entities'])
606
- end
607
- end
608
-
609
- class Entities
610
- attr_reader :user_mentions
611
- attr_reader :urls
612
- attr_reader :hashtags
613
-
614
- def initialize(element)
615
- @user_mentions = UserMention.new(element.elements['user_mention'])
616
- @urls = URL.new(element.elements['urls'])
617
- @hashtags = Hashtag.new(element.elements['hashtags'])
618
- end
619
- end
620
-
621
- class UserMention
622
- attr_reader :id
623
- attr_reader :screen_name
624
- attr_reader :name
625
- attr_reader :start
626
- attr_reader :end
627
-
628
- def initialize(element)
629
- @id = element.elements['id'].text()
630
- @screen_name = element.elements['screen_name'].text()
631
- @name = element.elements['name'].text()
632
- @start = element.attributes['start']
633
- @end = element.attributes['end']
634
- end
635
- end
636
-
637
- class URL
638
- attr_reader :url
639
- attr_reader :expanded_url
640
- attr_reader :start
641
- attr_reader :end
642
-
643
- def initialize(element)
644
- @url = element.elements['url'].text()
645
- @expanded_url = element.elements['expanded_url'].text()
646
- @start = element.attributes['start']
647
- @end = element.attributes['end']
648
- end
649
- end
650
-
651
- class Hashtag
652
- attr_reader :text
653
- attr_reader :start
654
- attr_reader :end
655
-
656
- def initialize(element)
657
- @text = element.elements['text'].text()
658
- @start = element.attributes['start']
659
- @end = element.attributes['end']
660
- end
661
- end
662
- end
3
+ require "net/http"
4
+ require "uri"
5
+ require "pp"
6
+ require "rubygems" if RUBY_VERSION < "1.9.0"
7
+ require "json"
8
+ require "oauth"
9
+
10
+ $LOAD_PATH << File.dirname(File.expand_path(__FILE__)) if RUBY_VERSION >= "1.9.0"
11
+ require "pupil/base"
12
+ require "pupil/schemes"
13
+ require "pupil/account"
14
+ require "pupil/statuses"
15
+ require "pupil/users"
16
+ require "pupil/direct_messages"
17
+ require "pupil/lists"
18
+ require "pupil/friendships"
19
+ require "pupil/blocks"
20
+ require "pupil/stream"