myspaceid-sdk 0.1.9 → 0.1.11
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/Rakefile +66 -0
- data/lib/myspace.rb +1 -1
- data/lib/myspace/end_point.rb +1 -1
- data/lib/myspace/myspace.rb +152 -58
- data/samples/rails/sample/app/controllers/oauth_controller.rb +1 -3
- data/samples/rails/sample/app/controllers/openid_controller.rb +1 -3
- data/samples/rails/sample/app/controllers/user_controller.rb +1 -3
- data/test/myspace_test.rb +6 -3
- data/test/tc_albums.rb +46 -41
- data/test/tc_friends.rb +48 -40
- data/test/tc_profile.rb +45 -55
- data/test/tc_videos.rb +39 -35
- data/test/test_data.rb +7 -4
- metadata +3 -3
- data/test/data.rb +0 -8
data/Rakefile
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'rake/packagetask'
|
3
|
+
# require 'rake/rdoctask'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
$LOAD_PATH.push('lib')
|
7
|
+
require 'myspace.rb'
|
8
|
+
|
9
|
+
Hoe.new('myspaceid-sdk', MySpace::VERSION) do |p|
|
10
|
+
p.author = 'Christopher B. Baker'
|
11
|
+
p.email = 'cbaker@myspace.com'
|
12
|
+
p.rubyforge_name = 'myspaceid-sdk'
|
13
|
+
p.extra_deps = ['ruby-openid', 'oauth', 'json']
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Generate manifest file programmatically"
|
17
|
+
task :generate_manifest do
|
18
|
+
files = FileList[
|
19
|
+
'README.txt', 'lib/**/*', 'test/**/*', 'samples/**/*'
|
20
|
+
].exclude(/db\/cstore|log\/|public\/doc|tmp/)
|
21
|
+
|
22
|
+
File.rename('Manifest.txt', "Manifest-#{Time.now.to_i.to_s}.txt") if File.exists?('Manifest.txt')
|
23
|
+
File.open('Manifest.txt', 'w') do |f|
|
24
|
+
files.each do |name|
|
25
|
+
f.write(name + "\n")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# desc "Build the rubygem for the SDK"
|
31
|
+
# task 'build-gem' => [] do
|
32
|
+
# sh %{gem build myspaceid-sdk.gemspec}
|
33
|
+
# end
|
34
|
+
|
35
|
+
# desc "Build the online documetation for the SDK"
|
36
|
+
# task 'build-docs' => [] do
|
37
|
+
# sh %{rdoc --fmt html}
|
38
|
+
# end
|
39
|
+
|
40
|
+
desc "Run the unit tests"
|
41
|
+
Rake::TestTask.new do |t|
|
42
|
+
t.libs << "test"
|
43
|
+
t.test_files = 'ts_alltests.rb'
|
44
|
+
t.verbose = true
|
45
|
+
end
|
46
|
+
# Rake::RDocTask.new('rdoc') do |t|
|
47
|
+
# t.rdoc_files.include('README', 'lib/**/*.rb')
|
48
|
+
# t.main = 'README'
|
49
|
+
# t.title = "MySpaceID SDK documentation"
|
50
|
+
# end
|
51
|
+
|
52
|
+
# rubyforge_project = 'myspaceid-sdk'
|
53
|
+
# rubyforge_user = 'cbaker'
|
54
|
+
# rubyforge_path = "/var/www/gforge-projects/#{rubyforge_project}/"
|
55
|
+
# desc 'Upload documentation to RubyForge.'
|
56
|
+
# task 'upload-docs' => ['rdoc'] do
|
57
|
+
# sh "scp -r html/* " + "#{rubyforge_user}@rubyforge.org:#{rubyforge_path}"
|
58
|
+
# end
|
59
|
+
|
60
|
+
desc "Generate doc files, but deal with source control as well"
|
61
|
+
task 'generate-docs' do
|
62
|
+
sh %{git rm -rf doc}
|
63
|
+
sh %{rake docs}
|
64
|
+
sh %{git add doc}
|
65
|
+
sh %{git commmit -m 'autogenerated docs' doc}
|
66
|
+
end
|
data/lib/myspace.rb
CHANGED
data/lib/myspace/end_point.rb
CHANGED
data/lib/myspace/myspace.rb
CHANGED
@@ -16,31 +16,38 @@ module MySpace
|
|
16
16
|
# tests regularly timeout at 2 seconds
|
17
17
|
TIMEOUT_SECS = 3 unless const_defined?('TIMEOUT_SECS')
|
18
18
|
|
19
|
-
|
20
|
-
EndPoint.define(:
|
21
|
-
EndPoint.define(:
|
22
|
-
EndPoint.define(:
|
23
|
-
EndPoint.define(:
|
24
|
-
EndPoint.define(:
|
25
|
-
EndPoint.define(:
|
26
|
-
EndPoint.define(:
|
27
|
-
EndPoint.define(:
|
28
|
-
EndPoint.define(:
|
29
|
-
EndPoint.define(:
|
30
|
-
EndPoint.define(:
|
31
|
-
EndPoint.define(:
|
32
|
-
EndPoint.define(:
|
33
|
-
EndPoint.define(:
|
34
|
-
EndPoint.define(:
|
35
|
-
EndPoint.define(:
|
36
|
-
EndPoint.define(:
|
37
|
-
EndPoint.define(:
|
38
|
-
EndPoint.define(:
|
39
|
-
EndPoint.define(:
|
40
|
-
EndPoint.define(:
|
41
|
-
EndPoint.define(:
|
42
|
-
EndPoint.define(:
|
43
|
-
EndPoint.define(:
|
19
|
+
|
20
|
+
EndPoint.define(:user_info, '/v1/user', :get, :v1_json)
|
21
|
+
EndPoint.define(:albums, '/v1/users/{user_id}/albums', :get, :v1_json)
|
22
|
+
EndPoint.define(:album_info, '/v1/users/{user_id}/albums/{album_id}', :get, :v1_json)
|
23
|
+
EndPoint.define(:album, '/v1/users/{user_id}/albums/{album_id}/photos', :get, :v1_json)
|
24
|
+
EndPoint.define(:friends, '/v1/users/{user_id}/friends', :get, :v1_json)
|
25
|
+
EndPoint.define(:friendship, '/v1/users/{user_id}/friends/{friend_ids}', :get, :v1_json)
|
26
|
+
EndPoint.define(:friends_list, '/v1/users/{user_id}/friendslist/{friend_ids}', :get, :v1_json)
|
27
|
+
EndPoint.define(:mood_get, '/v1/users/{user_id}/mood', :get, :v1_json)
|
28
|
+
EndPoint.define(:mood_put, '/v1/users/{user_id}/mood', :put)
|
29
|
+
EndPoint.define(:moods, '/v1/users/{user_id}/moods', :get, :v1_json)
|
30
|
+
EndPoint.define(:photos, '/v1/users/{user_id}/photos', :get, :v1_json)
|
31
|
+
EndPoint.define(:photo, '/v1/users/{user_id}/photos/{photo_id}', :get, :v1_json)
|
32
|
+
EndPoint.define(:profile, '/v1/users/{user_id}/profile', :get, :v1_json)
|
33
|
+
EndPoint.define(:status_get, '/v1/users/{user_id}/status', :get, :v1_json)
|
34
|
+
EndPoint.define(:status_put, '/v1/users/{user_id}/status', :put)
|
35
|
+
EndPoint.define(:videos, '/v1/users/{user_id}/videos', :get, :v1_json)
|
36
|
+
EndPoint.define(:video, '/v1/users/{user_id}/videos/{video_id}', :get, :v1_json)
|
37
|
+
EndPoint.define(:activities, '/v1/users/{user_id}/activities.atom', :get)
|
38
|
+
EndPoint.define(:friends_activities, '/v1/users/{user_id}/friends/activities.atom', :get)
|
39
|
+
EndPoint.define(:appdata_global_get, '/v1/appdata/global', :get, :v1_json)
|
40
|
+
EndPoint.define(:appdata_global_keys_get, '/v1/appdata/global/{keys}', :get, :v1_json)
|
41
|
+
EndPoint.define(:appdata_global_put, '/v1/appdata/global', :put)
|
42
|
+
EndPoint.define(:appdata_global_delete, '/v1/appdata/global/{keys}', :delete)
|
43
|
+
EndPoint.define(:appdata_user_get, '/v1/users/{user_id}/appdata', :get, :v1_json)
|
44
|
+
EndPoint.define(:appdata_user_keys_get, '/v1/users/{user_id}/appdata/{keys}', :get, :v1_json)
|
45
|
+
EndPoint.define(:appdata_user_put, '/v1/users/{user_id}/appdata', :put)
|
46
|
+
EndPoint.define(:appdata_user_delete, '/v1/users/{user_id}/appdata/{keys}', :delete)
|
47
|
+
EndPoint.define(:appdata_friends_get, '/v1/users/{user_id}/friends/appdata', :get, :v1_json)
|
48
|
+
EndPoint.define(:appdata_friends_keys_get, '/v1/users/{user_id}/friends/appdata/{keys}', :get, :v1_json)
|
49
|
+
EndPoint.define(:indicators, '/v1/users/{user_id}/indicators', :get, :v1_json)
|
50
|
+
|
44
51
|
|
45
52
|
attr_reader :consumer
|
46
53
|
attr_accessor :http_logger
|
@@ -74,6 +81,7 @@ module MySpace
|
|
74
81
|
@consumer = ::OAuth::Consumer.new(oauth_token_key,
|
75
82
|
oauth_token_secret,
|
76
83
|
:scheme => :query_string,
|
84
|
+
# :scheme => :header,
|
77
85
|
:http_method => :get,
|
78
86
|
:site => OAUTH_SITES[site],
|
79
87
|
:request_token_path => OAUTH_REQUEST_TOKEN_URL,
|
@@ -164,6 +172,35 @@ module MySpace
|
|
164
172
|
call_myspace_api(:albums, params.dup.update(:user_id => user_id, :v1_json => true))
|
165
173
|
end
|
166
174
|
|
175
|
+
# Get the photo album description for user +user_id+ and album +album_id+
|
176
|
+
#
|
177
|
+
# {"photosUri"=>"http://api.myspace.com/v1/users/456073223/albums/40418/photos",
|
178
|
+
# "photoCount"=>1,
|
179
|
+
# "location"=>"",
|
180
|
+
# "title"=>"My Photos",
|
181
|
+
# "id"=>40418,
|
182
|
+
# "defaultImage"=>
|
183
|
+
# "http://c1.ac-images.myspacecdn.com/images02/45/m_f820313641924f0f90004932c8bc310c.jpg",
|
184
|
+
# "privacy"=>"Everyone",
|
185
|
+
# "user"=>
|
186
|
+
# {"name"=>"Bob",
|
187
|
+
# "uri"=>"http://api.myspace.com/v1/users/456073223",
|
188
|
+
# "webUri"=>"http://www.myspace.com/bobvontestacount",
|
189
|
+
# "largeImage"=>
|
190
|
+
# "http://c1.ac-images.myspacecdn.com/images02/45/l_f820313641924f0f90004932c8bc310c.jpg",
|
191
|
+
# "userType"=>"RegularUser",
|
192
|
+
# "userId"=>456073223,
|
193
|
+
# "image"=>
|
194
|
+
# "http://c1.ac-images.myspacecdn.com/images02/45/s_f820313641924f0f90004932c8bc310c.jpg"},
|
195
|
+
# "albumUri"=>"http://api.myspace.com/v1/users/456073223/albums/40418"}
|
196
|
+
def get_album_info(user_id, album_id, params = {})
|
197
|
+
user_id = user_id.to_s
|
198
|
+
validate_identifier(:user_id, user_id)
|
199
|
+
album_id = album_id.to_s
|
200
|
+
validate_identifier(:album_id, album_id)
|
201
|
+
call_myspace_api(:album_info, params.dup.update(:user_id => user_id, :album_id => album_id, :v1_json => true))
|
202
|
+
end
|
203
|
+
|
167
204
|
# Get the photo descriptions for the photos of album +album_id+
|
168
205
|
# for the user +user_id+:
|
169
206
|
#
|
@@ -261,6 +298,19 @@ module MySpace
|
|
261
298
|
call_myspace_api(:friendship, :user_id => user_id, :friend_ids => friend_ids.join(';'), :v1_json => true)
|
262
299
|
end
|
263
300
|
|
301
|
+
# Gets the list of friends for the user +user_id+, for the friends
|
302
|
+
# in +friend_ids+. Use this call if you only need information
|
303
|
+
# about a specific set of friends whose ids you already know.
|
304
|
+
def get_friends_list(user_id, *friend_ids)
|
305
|
+
user_id = user_id.to_s
|
306
|
+
validate_identifier(:user_id, user_id)
|
307
|
+
friend_ids.each do |friend_id|
|
308
|
+
friend_id = friend_id.to_s
|
309
|
+
validate_identifier(:friend_ids, friend_id)
|
310
|
+
end
|
311
|
+
call_myspace_api(:friends_list, :user_id => user_id, :friend_ids => friend_ids.join(';'), :v1_json => true)
|
312
|
+
end
|
313
|
+
|
264
314
|
# Gets the mood of user +user_id+:
|
265
315
|
#
|
266
316
|
# {"mood"=>"tested",
|
@@ -280,7 +330,48 @@ module MySpace
|
|
280
330
|
def get_mood(user_id, params = {})
|
281
331
|
user_id = user_id.to_s
|
282
332
|
validate_identifier(:user_id, user_id)
|
283
|
-
call_myspace_api(:
|
333
|
+
call_myspace_api(:mood_get, params.dup.update(:user_id => user_id, :v1_json => true))
|
334
|
+
end
|
335
|
+
|
336
|
+
# Sets the mood of the user +user_id+ to +mood_id+, which must be
|
337
|
+
# a number from this list:
|
338
|
+
#
|
339
|
+
# http://wiki.developer.myspace.com/index.php?title=Myspace_mood_data_names_codes_images
|
340
|
+
def set_mood(user_id, mood_id)
|
341
|
+
user_id = user_id.to_s
|
342
|
+
validate_identifier(:user_id, user_id)
|
343
|
+
mood_id = mood_id.to_s
|
344
|
+
validate_identifier(:mood_id, mood_id)
|
345
|
+
call_myspace_api(:mood_put, :user_id => user_id, :body => {:mood => mood_id})
|
346
|
+
end
|
347
|
+
|
348
|
+
# Gets and caches the list of available moods for user +user_id+.
|
349
|
+
def moods(user_id)
|
350
|
+
@moods ||= {}
|
351
|
+
@moods[user_id] ||= get_moods(user_id)
|
352
|
+
end
|
353
|
+
|
354
|
+
# Gets the mood names available for user +user_id+.
|
355
|
+
def mood_names(user_id)
|
356
|
+
moods(user_id).collect do |mood|
|
357
|
+
mood['moodName']
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
# Given a +user_id+ and the name of a mood, returns the
|
362
|
+
# corresponding mood id
|
363
|
+
def mood_id(user_id, name)
|
364
|
+
moods(user_id).each do |mood|
|
365
|
+
return mood['moodId'] if mood['moodName'] == name
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
# Gets the list of available moods for user +user_id+.
|
370
|
+
def get_moods(user_id, params = {})
|
371
|
+
user_id = user_id.to_s
|
372
|
+
validate_identifier(:user_id, user_id)
|
373
|
+
moods = call_myspace_api(:moods, params.dup.update(:user_id => user_id, :v1_json => true))
|
374
|
+
moods['moods']
|
284
375
|
end
|
285
376
|
|
286
377
|
# Gets the photo descriptions for the photos that belong to user +user_id+:
|
@@ -498,20 +589,25 @@ module MySpace
|
|
498
589
|
call_myspace_api(:video, params.dup.update(:user_id => user_id, :video_id => video_id, :v1_json => true))
|
499
590
|
end
|
500
591
|
|
592
|
+
# Gets the activity stream of user +user_id+
|
501
593
|
def get_activities(user_id, params = {})
|
502
594
|
user_id = user_id.to_s
|
503
595
|
validate_identifier(:user_id, user_id)
|
504
596
|
call_myspace_api(:activities, params.dup.update(:user_id => user_id))
|
505
597
|
end
|
506
598
|
|
599
|
+
# Gets the activity streams of the friends of user +user_id+
|
507
600
|
def get_friends_activities(user_id, params = {})
|
508
601
|
user_id = user_id.to_s
|
509
602
|
validate_identifier(:user_id, user_id)
|
510
603
|
call_myspace_api(:friends_activities, params.dup.update(:user_id => user_id))
|
511
604
|
end
|
512
|
-
|
605
|
+
|
606
|
+
# Gets the global application data. This can be anything the
|
607
|
+
# application wants. If you pass +keys+, only return data
|
608
|
+
# corresponding to the passed keys.
|
513
609
|
def get_global_appdata(*keys)
|
514
|
-
appdata_to_hash do
|
610
|
+
MySpace.appdata_to_hash do
|
515
611
|
if keys.length > 0
|
516
612
|
call_myspace_api(:appdata_global_keys_get, :keys => keys.join(';'), :v1_json => true)
|
517
613
|
else
|
@@ -520,16 +616,6 @@ module MySpace
|
|
520
616
|
end
|
521
617
|
end
|
522
618
|
|
523
|
-
def self.remove_null_values(hash)
|
524
|
-
hash.keys.inject([]) do |nulls, key|
|
525
|
-
unless hash[key]
|
526
|
-
hash.delete(key)
|
527
|
-
nulls << key
|
528
|
-
end
|
529
|
-
nulls
|
530
|
-
end
|
531
|
-
end
|
532
|
-
|
533
619
|
def set_global_appdata(params = {})
|
534
620
|
deletes = MySpace.remove_null_values(params)
|
535
621
|
|
@@ -544,7 +630,7 @@ module MySpace
|
|
544
630
|
def get_user_appdata(user_id, *keys)
|
545
631
|
user_id = user_id.to_s
|
546
632
|
validate_identifier(:user_id, user_id)
|
547
|
-
appdata_to_hash do
|
633
|
+
MySpace.appdata_to_hash do
|
548
634
|
if keys.length > 0
|
549
635
|
call_myspace_api(:appdata_user_keys_get, :user_id => user_id, :keys => keys.join(';'), :v1_json => true)
|
550
636
|
else
|
@@ -570,23 +656,42 @@ module MySpace
|
|
570
656
|
def get_user_friends_appdata(user_id, *keys)
|
571
657
|
user_id = user_id.to_s
|
572
658
|
validate_identifier(:user_id, user_id)
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
659
|
+
if keys.length > 0
|
660
|
+
call_myspace_api(:appdata_friends_keys_get, :user_id => user_id, :keys => keys.join(';'), :v1_json => true)
|
661
|
+
else
|
662
|
+
call_myspace_api(:appdata_friends_get, :user_id => user_id, :v1_json => true)
|
663
|
+
end.inject({}) do |hash, friend|
|
664
|
+
hash.update(friend['userid'].to_s => MySpace.appdata_to_hash(friend))
|
665
|
+
end
|
666
|
+
end
|
667
|
+
|
668
|
+
protected
|
669
|
+
|
670
|
+
def self.remove_null_values(hash)
|
671
|
+
hash.keys.inject([]) do |nulls, key|
|
672
|
+
unless hash[key]
|
673
|
+
hash.delete(key)
|
674
|
+
nulls << key
|
578
675
|
end
|
676
|
+
nulls
|
579
677
|
end
|
580
678
|
end
|
581
679
|
|
582
|
-
def appdata_to_hash(&block)
|
583
|
-
appdata = yield
|
680
|
+
def self.appdata_to_hash(appdata = {}, &block)
|
681
|
+
appdata = yield if block_given?
|
584
682
|
return {} unless appdata['keyvaluecollection']
|
585
683
|
appdata['keyvaluecollection'].inject({}) do |hash, entry|
|
586
684
|
hash.update(entry['key'].to_sym => entry['value'])
|
587
685
|
end
|
588
686
|
end
|
589
687
|
|
688
|
+
public
|
689
|
+
|
690
|
+
def get_indicators(user_id)
|
691
|
+
user_id = user_id.to_s
|
692
|
+
validate_identifier(:user_id, user_id)
|
693
|
+
call_myspace_api(:indicators, :user_id => user_id, :v1_json => true)
|
694
|
+
end
|
590
695
|
|
591
696
|
def call_myspace_api(name, params = {}, &block)
|
592
697
|
params = params.dup
|
@@ -629,18 +734,6 @@ module MySpace
|
|
629
734
|
end
|
630
735
|
end
|
631
736
|
|
632
|
-
# def call_myspace_api_json(url, method = :get, params = {})
|
633
|
-
# call_myspace_api(url, method, params) do |body|
|
634
|
-
# JSON::parse(body)
|
635
|
-
# end
|
636
|
-
# end
|
637
|
-
|
638
|
-
# def call_myspace_api_xml(url, method = :get, params = {})
|
639
|
-
# call_myspace_api(url, method, params) do |body|
|
640
|
-
# REXML::Document.new(body)
|
641
|
-
# end
|
642
|
-
# end
|
643
|
-
|
644
737
|
protected
|
645
738
|
|
646
739
|
ID_REGEXP = /[0-9]+/ unless const_defined?('ID_REGEXP')
|
@@ -664,3 +757,4 @@ module MySpace
|
|
664
757
|
end
|
665
758
|
end
|
666
759
|
end
|
760
|
+
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'myspace'
|
2
2
|
|
3
|
-
|
4
|
-
raise "You must create a consumer_key.rb file with your application credentials in it. See #{File.expand_path(File.join(File.dirname(__FILE__), "/../../../../README"))} for more info." unless File.exists?(key_file)
|
5
|
-
require key_file
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../../../consumer_key.rb"))
|
6
4
|
|
7
5
|
class OauthController < ApplicationController
|
8
6
|
include ConsumerKey
|
@@ -7,9 +7,7 @@ require 'openid/store/filesystem'
|
|
7
7
|
|
8
8
|
require 'myspace'
|
9
9
|
|
10
|
-
|
11
|
-
raise "You must create a consumer_key.rb file with your application credentials in it. See #{File.expand_path(File.join(File.dirname(__FILE__), "/../../../../README"))} for more info." unless File.exists?(key_file)
|
12
|
-
require key_file
|
10
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../../../consumer_key.rb"))
|
13
11
|
|
14
12
|
class OpenidController < ApplicationController
|
15
13
|
include ConsumerKey
|
@@ -7,9 +7,7 @@ require 'openid/store/filesystem'
|
|
7
7
|
|
8
8
|
require 'myspace'
|
9
9
|
|
10
|
-
|
11
|
-
raise "You must create a consumer_key.rb file with your application credentials in it. See #{File.expand_path(File.join(File.dirname(__FILE__), "/../../../../README"))} for more info." unless File.exists?(key_file)
|
12
|
-
require key_file
|
10
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "/../../../consumer_key.rb"))
|
13
11
|
|
14
12
|
class UserController < ApplicationController
|
15
13
|
include ConsumerKey
|
data/test/myspace_test.rb
CHANGED
@@ -8,9 +8,11 @@ module MySpaceTest
|
|
8
8
|
include TestData
|
9
9
|
|
10
10
|
def setup
|
11
|
-
@
|
12
|
-
|
13
|
-
|
11
|
+
@ms_offsite = MySpace::MySpace.new(OFFSITE_KEY, OFFSITE_SECRET,
|
12
|
+
:access_token => TOKEN, :access_token_secret => SECRET,
|
13
|
+
:logger => Logger.new($stdout))
|
14
|
+
@ms_onsite = MySpace::MySpace.new(ONSITE_KEY, ONSITE_SECRET, :application_type => MySpace::MySpace::APPLICATION_TYPE_ONSITE,
|
15
|
+
:logger => Logger.new($stdout))
|
14
16
|
end
|
15
17
|
|
16
18
|
class Tester
|
@@ -29,4 +31,5 @@ module MySpaceTest
|
|
29
31
|
end
|
30
32
|
assert(tester.passed)
|
31
33
|
end
|
34
|
+
|
32
35
|
end
|
data/test/tc_albums.rb
CHANGED
@@ -6,25 +6,28 @@ class TC_Albums < Test::Unit::TestCase
|
|
6
6
|
|
7
7
|
def test_albums
|
8
8
|
obj = nil
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
10
|
+
BAD_IDS.each do |value|
|
11
|
+
assert_raise(MySpace::BadIdentifier) do
|
12
|
+
obj = ms.get_albums(value)
|
13
|
+
end
|
12
14
|
end
|
15
|
+
assert_nothing_raised do
|
16
|
+
obj = ms.get_albums(USER_ID)
|
17
|
+
end
|
18
|
+
assert_equal(1, obj['count'])
|
19
|
+
albums = obj['albums']
|
20
|
+
assert_instance_of(Array, albums)
|
21
|
+
assert_equal(1, albums.length)
|
22
|
+
album = albums[0]
|
23
|
+
assert_instance_of(Hash, album)
|
24
|
+
album_id = album['id'].to_s
|
25
|
+
assert_equal('40418', album_id)
|
26
|
+
title = album['title']
|
27
|
+
assert_instance_of(String, title)
|
28
|
+
# oops this is culture specific
|
29
|
+
# assert_equal('My Photos', title)
|
13
30
|
end
|
14
|
-
assert_nothing_raised do
|
15
|
-
obj = @myspace.get_albums(USER_ID)
|
16
|
-
end
|
17
|
-
assert_equal(1, obj['count'])
|
18
|
-
albums = obj['albums']
|
19
|
-
assert_instance_of(Array, albums)
|
20
|
-
assert_equal(1, albums.length)
|
21
|
-
album = albums[0]
|
22
|
-
assert_instance_of(Hash, album)
|
23
|
-
album_id = album['id'].to_s
|
24
|
-
assert_equal('40418', album_id)
|
25
|
-
title = album['title']
|
26
|
-
assert_instance_of(String, title)
|
27
|
-
assert_equal('My Photos', title)
|
28
31
|
end
|
29
32
|
|
30
33
|
# {"albums"=>
|
@@ -62,33 +65,35 @@ class TC_Albums < Test::Unit::TestCase
|
|
62
65
|
|
63
66
|
def test_album
|
64
67
|
obj = nil
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
69
|
+
BAD_IDS.each do |value|
|
70
|
+
assert_raise(MySpace::BadIdentifier) do
|
71
|
+
obj = ms.get_album(value, ALBUM_ID)
|
72
|
+
end
|
68
73
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
74
|
+
BAD_IDS.each do |value|
|
75
|
+
assert_raise(MySpace::BadIdentifier) do
|
76
|
+
obj = ms.get_album(USER_ID, value)
|
77
|
+
end
|
73
78
|
end
|
79
|
+
assert_raise(MySpace::RestException) do
|
80
|
+
obj = ms.get_album(USER_ID, "1234")
|
81
|
+
end
|
82
|
+
assert_nothing_raised do
|
83
|
+
obj = ms.get_album(USER_ID, ALBUM_ID)
|
84
|
+
end
|
85
|
+
assert_equal(1, obj['count'])
|
86
|
+
photos = obj['photos']
|
87
|
+
assert_instance_of(Array, photos)
|
88
|
+
assert_equal(1, photos.length)
|
89
|
+
photo = photos[0]
|
90
|
+
assert_instance_of(Hash, photo)
|
91
|
+
photo_id = photo['id'].to_s
|
92
|
+
assert_equal(PHOTO_ID, photo_id)
|
93
|
+
caption = photo['caption']
|
94
|
+
assert_instance_of(String, caption)
|
95
|
+
assert_equal('', caption)
|
74
96
|
end
|
75
|
-
assert_raise(MySpace::RestException) do
|
76
|
-
obj = @myspace.get_album(USER_ID, "1234")
|
77
|
-
end
|
78
|
-
assert_nothing_raised do
|
79
|
-
obj = @myspace.get_album(USER_ID, ALBUM_ID)
|
80
|
-
end
|
81
|
-
assert_equal(1, obj['count'])
|
82
|
-
photos = obj['photos']
|
83
|
-
assert_instance_of(Array, photos)
|
84
|
-
assert_equal(1, photos.length)
|
85
|
-
photo = photos[0]
|
86
|
-
assert_instance_of(Hash, photo)
|
87
|
-
photo_id = photo['id'].to_s
|
88
|
-
assert_equal(PHOTO_ID, photo_id)
|
89
|
-
caption = photo['caption']
|
90
|
-
assert_instance_of(String, caption)
|
91
|
-
assert_equal('', caption)
|
92
97
|
end
|
93
98
|
|
94
99
|
# {"photos"=>
|
data/test/tc_friends.rb
CHANGED
@@ -6,29 +6,34 @@ class TC_Friends < Test::Unit::TestCase
|
|
6
6
|
|
7
7
|
def test_friends
|
8
8
|
obj = nil
|
9
|
-
BAD_IDS.each do |value|
|
10
|
-
assert_raise(MySpace::BadIdentifier) do
|
11
|
-
obj = @myspace.get_friends(value)
|
12
|
-
end
|
13
|
-
end
|
14
9
|
assert_raise(OAuth::Problem) do
|
15
|
-
obj = @
|
10
|
+
obj = @ms_offsite.get_friends("6221")
|
11
|
+
end
|
12
|
+
assert_raise(MySpace::PermissionDenied) do
|
13
|
+
obj = @ms_onsite.get_friends("6221")
|
16
14
|
end
|
17
|
-
|
18
|
-
|
15
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
16
|
+
BAD_IDS.each do |value|
|
17
|
+
assert_raise(MySpace::BadIdentifier) do
|
18
|
+
obj = ms.get_friends(value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
assert_nothing_raised do
|
22
|
+
obj = ms.get_friends(USER_ID)
|
23
|
+
end
|
24
|
+
count = obj['count']
|
25
|
+
assert_instance_of(Fixnum, count)
|
26
|
+
assert_equal(2, count)
|
27
|
+
friends = obj['Friends']
|
28
|
+
assert_instance_of(Array, friends)
|
29
|
+
assert_equal(count, friends.length)
|
30
|
+
tom = friends[0]
|
31
|
+
name = tom['name']
|
32
|
+
assert_instance_of(String, name)
|
33
|
+
assert_equal('Tom', name)
|
34
|
+
userid = tom['userId'].to_s
|
35
|
+
assert_equal("6221", userid)
|
19
36
|
end
|
20
|
-
count = obj['count']
|
21
|
-
assert_instance_of(Fixnum, count)
|
22
|
-
assert_equal(1, count)
|
23
|
-
friends = obj['Friends']
|
24
|
-
assert_instance_of(Array, friends)
|
25
|
-
assert_equal(count, friends.length)
|
26
|
-
tom = friends[0]
|
27
|
-
name = tom['name']
|
28
|
-
assert_instance_of(String, name)
|
29
|
-
assert_equal('Tom', name)
|
30
|
-
userid = tom['userId'].to_s
|
31
|
-
assert_equal("6221", userid)
|
32
37
|
end
|
33
38
|
# {"topFriends"=>"http://api.myspace.com/v1/users/456073223/friends?list=top",
|
34
39
|
# "Friends"=>
|
@@ -53,30 +58,33 @@ class TC_Friends < Test::Unit::TestCase
|
|
53
58
|
|
54
59
|
def test_friendship
|
55
60
|
obj = nil
|
56
|
-
|
57
|
-
|
58
|
-
|
61
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
62
|
+
BAD_IDS.each do |value|
|
63
|
+
assert_raise(MySpace::BadIdentifier) do
|
64
|
+
obj = ms.get_friendship(USER_ID, value, "12341234", "456073223")
|
65
|
+
end
|
59
66
|
end
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
67
|
+
BAD_IDS.each do |value|
|
68
|
+
assert_raise(MySpace::BadIdentifier) do
|
69
|
+
obj = ms.get_friendship(USER_ID, 6221, value, "456073223")
|
70
|
+
end
|
64
71
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
72
|
+
BAD_IDS.each do |value|
|
73
|
+
assert_raise(MySpace::BadIdentifier) do
|
74
|
+
obj = ms.get_friendship(USER_ID, 6221, "12341234", value)
|
75
|
+
end
|
69
76
|
end
|
77
|
+
|
78
|
+
assert_nothing_raised do
|
79
|
+
obj = ms.get_friendship(USER_ID, 6221, "12341234", "456073223")
|
80
|
+
end
|
81
|
+
friendship = obj['friendship']
|
82
|
+
assert_instance_of(Array, friendship)
|
83
|
+
assert_equal(3, friendship.length)
|
84
|
+
assert_equal(true, friendship[0]['areFriends'])
|
85
|
+
assert_equal(false, friendship[1]['areFriends'])
|
86
|
+
assert_equal(true, friendship[2]['areFriends'])
|
70
87
|
end
|
71
|
-
assert_nothing_raised do
|
72
|
-
obj = @myspace.get_friendship(USER_ID, 6221, "12341234", "456073223")
|
73
|
-
end
|
74
|
-
friendship = obj['friendship']
|
75
|
-
assert_instance_of(Array, friendship)
|
76
|
-
assert_equal(3, friendship.length)
|
77
|
-
assert_equal(true, friendship[0]['areFriends'])
|
78
|
-
assert_equal(false, friendship[1]['areFriends'])
|
79
|
-
assert_equal(true, friendship[2]['areFriends'])
|
80
88
|
end
|
81
89
|
|
82
90
|
# {"friendship"=>
|
data/test/tc_profile.rb
CHANGED
@@ -10,21 +10,22 @@ class TC_Profile < Test::Unit::TestCase
|
|
10
10
|
def test_userid
|
11
11
|
user_id = nil
|
12
12
|
assert_nothing_raised do
|
13
|
-
user_id = @
|
13
|
+
user_id = @ms_offsite.get_userid
|
14
14
|
end
|
15
15
|
assert_instance_of(String, user_id)
|
16
16
|
assert_equal(USER_ID, user_id)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_profile
|
20
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
20
21
|
obj = nil
|
21
22
|
BAD_IDS.each do |value|
|
22
23
|
assert_raise(MySpace::BadIdentifier) do
|
23
|
-
obj =
|
24
|
+
obj = ms.get_profile(value)
|
24
25
|
end
|
25
26
|
end
|
26
27
|
assert_nothing_raised do
|
27
|
-
obj =
|
28
|
+
obj = ms.get_profile(USER_ID)
|
28
29
|
end
|
29
30
|
assert_instance_of(Hash, obj)
|
30
31
|
basic_profile = obj['basicprofile']
|
@@ -44,74 +45,63 @@ class TC_Profile < Test::Unit::TestCase
|
|
44
45
|
image = basic_profile['image']
|
45
46
|
assert_instance_of(String, image)
|
46
47
|
assert_equal("http://c1.ac-images.myspacecdn.com/images02/45/s_f820313641924f0f90004932c8bc310c.jpg", image)
|
48
|
+
end
|
47
49
|
end
|
48
50
|
|
49
51
|
def test_mood
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
53
|
+
obj = nil
|
54
|
+
BAD_IDS.each do |value|
|
55
|
+
assert_raise(MySpace::BadIdentifier) do
|
56
|
+
obj = ms.get_mood(value)
|
57
|
+
end
|
54
58
|
end
|
59
|
+
assert_nothing_raised do
|
60
|
+
obj = ms.get_mood(USER_ID)
|
61
|
+
end
|
62
|
+
assert_instance_of(Hash, obj)
|
63
|
+
mood = obj['mood']
|
64
|
+
assert_instance_of(String, mood)
|
65
|
+
# assert_equal("tested", mood)
|
66
|
+
# mood_image = obj['moodImageUrl']
|
67
|
+
# assert_instance_of(String, mood_image)
|
68
|
+
# assert_equal("http://x.myspacecdn.com/images/blog/moods/iBrads/confused.gif", mood_image)
|
55
69
|
end
|
56
|
-
assert_nothing_raised do
|
57
|
-
obj = @myspace.get_mood(USER_ID)
|
58
|
-
end
|
59
|
-
assert_instance_of(Hash, obj)
|
60
|
-
mood = obj['mood']
|
61
|
-
assert_instance_of(String, mood)
|
62
|
-
assert_equal("tested", mood)
|
63
|
-
mood_image = obj['moodImageUrl']
|
64
|
-
assert_instance_of(String, mood_image)
|
65
|
-
assert_equal("http://x.myspacecdn.com/images/blog/moods/iBrads/confused.gif", mood_image)
|
66
70
|
end
|
67
71
|
|
68
72
|
def test_status
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
74
|
+
obj = nil
|
75
|
+
BAD_IDS.each do |value|
|
76
|
+
assert_raise(MySpace::BadIdentifier) do
|
77
|
+
obj = ms.get_status(value)
|
78
|
+
end
|
73
79
|
end
|
74
|
-
end
|
75
|
-
assert_nothing_raised do
|
76
|
-
obj = @myspace.get_status(USER_ID)
|
77
|
-
end
|
78
|
-
assert_instance_of(Hash, obj)
|
79
|
-
status = obj['status']
|
80
|
-
assert_instance_of(String, status)
|
81
|
-
# assert_equal("Testing", status)
|
82
|
-
|
83
|
-
assert_nothing_raised do
|
84
|
-
@myspace.set_status(USER_ID, "Updating!")
|
85
|
-
end
|
86
|
-
|
87
|
-
assert_passes_eventually do |result|
|
88
80
|
assert_nothing_raised do
|
89
|
-
obj =
|
81
|
+
obj = ms.get_status(USER_ID)
|
90
82
|
end
|
91
83
|
assert_instance_of(Hash, obj)
|
92
84
|
status = obj['status']
|
93
85
|
assert_instance_of(String, status)
|
94
|
-
|
95
|
-
end
|
86
|
+
# assert_equal("Testing", status)
|
96
87
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
# obj = @myspace.get_status(USER_ID)
|
101
|
-
# end
|
102
|
-
# assert_instance_of(Hash, obj)
|
103
|
-
# status = obj['status']
|
104
|
-
# assert_instance_of(String, status)
|
105
|
-
# if status == "Updating!"
|
106
|
-
# passed = true
|
107
|
-
# break
|
108
|
-
# end
|
109
|
-
# sleep(0.1)
|
110
|
-
# end
|
111
|
-
# assert(passed)
|
88
|
+
assert_nothing_raised do
|
89
|
+
ms.set_status(USER_ID, "Updating!")
|
90
|
+
end
|
112
91
|
|
113
|
-
|
114
|
-
|
92
|
+
assert_passes_eventually do |result|
|
93
|
+
assert_nothing_raised do
|
94
|
+
obj = ms.get_status(USER_ID)
|
95
|
+
end
|
96
|
+
assert_instance_of(Hash, obj)
|
97
|
+
status = obj['status']
|
98
|
+
assert_instance_of(String, status)
|
99
|
+
result.passed = true if status == "Updating!"
|
100
|
+
end
|
101
|
+
|
102
|
+
assert_nothing_raised do
|
103
|
+
ms.set_status(USER_ID, "Testing")
|
104
|
+
end
|
115
105
|
end
|
116
106
|
end
|
117
107
|
end
|
data/test/tc_videos.rb
CHANGED
@@ -5,26 +5,28 @@ class TC_Videos < Test::Unit::TestCase
|
|
5
5
|
include MySpaceTest
|
6
6
|
|
7
7
|
def test_videos
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
9
|
+
obj = nil
|
10
|
+
BAD_IDS.each do |value|
|
11
|
+
assert_raise(MySpace::BadIdentifier) do
|
12
|
+
obj = ms.get_videos(value)
|
13
|
+
end
|
12
14
|
end
|
15
|
+
assert_nothing_raised do
|
16
|
+
obj = ms.get_videos(USER_ID)
|
17
|
+
end
|
18
|
+
assert_instance_of(Hash, obj)
|
19
|
+
assert_equal(1, obj['count'])
|
20
|
+
videos = obj['videos']
|
21
|
+
assert_instance_of(Array, videos)
|
22
|
+
assert_equal(1, videos.length)
|
23
|
+
video = videos[0]
|
24
|
+
video_id = video['id'].to_s
|
25
|
+
assert_equal(VIDEO_ID, video_id)
|
26
|
+
video_title = video['title']
|
27
|
+
assert_instance_of(String, video_title)
|
28
|
+
assert_equal(VIDEO_TITLE, video_title)
|
13
29
|
end
|
14
|
-
assert_nothing_raised do
|
15
|
-
obj = @myspace.get_videos(USER_ID)
|
16
|
-
end
|
17
|
-
assert_instance_of(Hash, obj)
|
18
|
-
assert_equal(1, obj['count'])
|
19
|
-
videos = obj['videos']
|
20
|
-
assert_instance_of(Array, videos)
|
21
|
-
assert_equal(1, videos.length)
|
22
|
-
video = videos[0]
|
23
|
-
video_id = video['id'].to_s
|
24
|
-
assert_equal(VIDEO_ID, video_id)
|
25
|
-
video_title = video['title']
|
26
|
-
assert_instance_of(String, video_title)
|
27
|
-
assert_equal(VIDEO_TITLE, video_title)
|
28
30
|
end
|
29
31
|
|
30
32
|
# {"videos"=>
|
@@ -70,26 +72,28 @@ class TC_Videos < Test::Unit::TestCase
|
|
70
72
|
# "http://c1.ac-images.myspacecdn.com/images02/45/s_f820313641924f0f90004932c8bc310c.jpg"}}
|
71
73
|
|
72
74
|
def test_video
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
[@ms_offsite, @ms_onsite].each do |ms|
|
76
|
+
obj = nil
|
77
|
+
BAD_IDS.each do |value|
|
78
|
+
assert_raise(MySpace::BadIdentifier) do
|
79
|
+
obj = ms.get_video(value, VIDEO_ID)
|
80
|
+
end
|
77
81
|
end
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
+
BAD_IDS.each do |value|
|
83
|
+
assert_raise(MySpace::BadIdentifier) do
|
84
|
+
obj = ms.get_video(USER_ID, value)
|
85
|
+
end
|
82
86
|
end
|
87
|
+
assert_nothing_raised do
|
88
|
+
obj = ms.get_video(USER_ID, VIDEO_ID)
|
89
|
+
end
|
90
|
+
assert_instance_of(Hash, obj)
|
91
|
+
video_id = obj['id'].to_s
|
92
|
+
assert_equal(VIDEO_ID, video_id)
|
93
|
+
video_title = obj['title']
|
94
|
+
assert_instance_of(String, video_title)
|
95
|
+
assert_equal(VIDEO_TITLE, video_title)
|
83
96
|
end
|
84
|
-
assert_nothing_raised do
|
85
|
-
obj = @myspace.get_video(USER_ID, VIDEO_ID)
|
86
|
-
end
|
87
|
-
assert_instance_of(Hash, obj)
|
88
|
-
video_id = obj['id'].to_s
|
89
|
-
assert_equal(VIDEO_ID, video_id)
|
90
|
-
video_title = obj['title']
|
91
|
-
assert_instance_of(String, video_title)
|
92
|
-
assert_equal(VIDEO_TITLE, video_title)
|
93
97
|
end
|
94
98
|
|
95
99
|
# {"totalrating"=>"0",
|
data/test/test_data.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
module TestData
|
2
|
-
|
3
|
-
|
2
|
+
OFFSITE_KEY = '18bed0f4247a4f79bc9941bfed5b534c' unless const_defined?('OFFSITE_KEY')
|
3
|
+
OFFSITE_SECRET = '2e8ebdafbef844a5929086e659e4188c' unless const_defined?('OFFSITE_SECRET')
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
ONSITE_KEY = 'http://perisphere.1939worldsfair.com/app.xml' unless const_defined?('ONSITE_KEY')
|
6
|
+
ONSITE_SECRET = 'eda0c62773234093bea92645eea0493d' unless const_defined?('ONSITE_SECRET')
|
7
|
+
|
8
|
+
TOKEN = 'iELpLIedJM1N1oz4tbsME4v8bbGiqE8D2DGs1MHvqM9386xJAiBYV7kAbPsKH1LfvMCDNUxk4IDl3KvtKzbqFEZAKW90DK1pkNml0cK1xuU=' unless const_defined?('TOKEN')
|
9
|
+
SECRET = '8805c751977a4b1d8bbf0d9913ae5840' unless const_defined?('SECRET')
|
7
10
|
|
8
11
|
USER_ID = '456073223' unless const_defined?('USER_ID')
|
9
12
|
ALBUM_ID = '40418' unless const_defined?('ALBUM_ID')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: myspaceid-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher B. Baker
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-05 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -62,6 +62,7 @@ extra_rdoc_files:
|
|
62
62
|
- README.txt
|
63
63
|
- samples/rails/sample/public/robots.txt
|
64
64
|
files:
|
65
|
+
- Rakefile
|
65
66
|
- README.txt
|
66
67
|
- lib/myspace.rb
|
67
68
|
- lib/myspace
|
@@ -73,7 +74,6 @@ files:
|
|
73
74
|
- test/tc_profile.rb
|
74
75
|
- test/myspace_test.rb
|
75
76
|
- test/tc_videos.rb
|
76
|
-
- test/data.rb
|
77
77
|
- test/ts_alltests.rb
|
78
78
|
- test/tc_friends.rb
|
79
79
|
- test/tc_albums.rb
|
data/test/data.rb
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
module TestData
|
2
|
-
CONSUMER_KEY = '5796bcaafb2a4e48a94f4c1849bb2058' unless const_defined?('CONSUMER_KEY')
|
3
|
-
CONSUMER_SECRET = '5311c1fbe72b47298d4db5a098ce26d0' unless const_defined?('CONSUMER_SECRET')
|
4
|
-
|
5
|
-
TOKEN = 'BFKvhXYYsrP88LvZ+Yi3qJ2syRnUkwRUB2wfWL9jROL+MFVWOXSZfg7pi37DlCSkYoHtxLiapKMQRMXFh4mvJi9ze3t9lvKAMm85WMKPka0=' unless const_defined?('TOKEN')
|
6
|
-
SECRET = 'a062817544804c8da349e7621a8a26cb' unless const_defined?('SECRET')
|
7
|
-
USER_ID = '456073223' unless const_defined?('USER_ID')
|
8
|
-
end
|