shortwave 0.0.1

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 (105) hide show
  1. data/.document +5 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +3 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +74 -0
  6. data/Rakefile +133 -0
  7. data/VERSION +1 -0
  8. data/lib/shortwave.rb +12 -0
  9. data/lib/shortwave/authentication.rb +107 -0
  10. data/lib/shortwave/facade.rb +3 -0
  11. data/lib/shortwave/facade/build/facade_builder.rb +199 -0
  12. data/lib/shortwave/facade/build/facade_template.erb +17 -0
  13. data/lib/shortwave/facade/lastfm.rb +878 -0
  14. data/lib/shortwave/facade/remote.rb +86 -0
  15. data/lib/shortwave/model/album.rb +33 -0
  16. data/lib/shortwave/model/artist.rb +62 -0
  17. data/lib/shortwave/model/base_model.rb +112 -0
  18. data/lib/shortwave/model/chart_dates.rb +15 -0
  19. data/lib/shortwave/model/comparison.rb +15 -0
  20. data/lib/shortwave/model/event.rb +55 -0
  21. data/lib/shortwave/model/group.rb +26 -0
  22. data/lib/shortwave/model/location.rb +45 -0
  23. data/lib/shortwave/model/playlist.rb +36 -0
  24. data/lib/shortwave/model/shout.rb +21 -0
  25. data/lib/shortwave/model/tag.rb +47 -0
  26. data/lib/shortwave/model/track.rb +71 -0
  27. data/lib/shortwave/model/user.rb +70 -0
  28. data/lib/shortwave/model/venue.rb +37 -0
  29. data/lib/shortwave/model/weekly_charts.rb +31 -0
  30. data/lib/shortwave/providers.rb +161 -0
  31. data/shortwave.gemspec +178 -0
  32. data/test/authentication_test.rb +64 -0
  33. data/test/build/build_test.rb +25 -0
  34. data/test/build/data/intro.yml +2 -0
  35. data/test/build/data/screens/album_addTags.html +1238 -0
  36. data/test/build/data/screens/intro_truncated.html +426 -0
  37. data/test/build/data/screens/tasteometer_compare.html +1274 -0
  38. data/test/build/data/screens/user_getLovedTracks.html +1278 -0
  39. data/test/build/data/screens/venue_search.html +1261 -0
  40. data/test/build/facade_builder_test.rb +23 -0
  41. data/test/build/parameter_test.rb +43 -0
  42. data/test/build/remote_method_test.rb +47 -0
  43. data/test/build/ruby_class_test.rb +12 -0
  44. data/test/build/ruby_method_test.rb +137 -0
  45. data/test/helper.rb +35 -0
  46. data/test/model/album_test.rb +62 -0
  47. data/test/model/artist_test.rb +103 -0
  48. data/test/model/chart_dates_test.rb +11 -0
  49. data/test/model/comparison_test.rb +18 -0
  50. data/test/model/data/album_info.xml +38 -0
  51. data/test/model/data/album_search.xml +210 -0
  52. data/test/model/data/artist_info.xml +58 -0
  53. data/test/model/data/artist_search.xml +109 -0
  54. data/test/model/data/artist_shouts.xml +546 -0
  55. data/test/model/data/artist_top_fans.xml +405 -0
  56. data/test/model/data/event_info.xml +47 -0
  57. data/test/model/data/group_members.xml +242 -0
  58. data/test/model/data/group_weekly_album_chart.xml +1754 -0
  59. data/test/model/data/group_weekly_artist_chart.xml +604 -0
  60. data/test/model/data/group_weekly_track_chart.xml +1005 -0
  61. data/test/model/data/location_events.xml +383 -0
  62. data/test/model/data/ok.xml +2 -0
  63. data/test/model/data/playlist_fetch.xml +227 -0
  64. data/test/model/data/tag_search.xml +110 -0
  65. data/test/model/data/tag_similar.xml +254 -0
  66. data/test/model/data/tag_top_albums.xml +805 -0
  67. data/test/model/data/tag_top_artists.xml +605 -0
  68. data/test/model/data/tag_top_tags.xml +1254 -0
  69. data/test/model/data/tag_top_tracks.xml +843 -0
  70. data/test/model/data/tag_weekly_chart_list.xml +57 -0
  71. data/test/model/data/tasteometer_compare.xml +54 -0
  72. data/test/model/data/track_info.xml +53 -0
  73. data/test/model/data/track_search.xml +195 -0
  74. data/test/model/data/user_chartlist.xml +90 -0
  75. data/test/model/data/user_info.xml +16 -0
  76. data/test/model/data/user_neighbours.xml +484 -0
  77. data/test/model/data/user_playlists.xml +17 -0
  78. data/test/model/data/user_recent_tracks.xml +124 -0
  79. data/test/model/data/user_recommended_artists.xml +454 -0
  80. data/test/model/data/user_shouts.xml +9 -0
  81. data/test/model/data/user_weekly_artist_chart.xml +478 -0
  82. data/test/model/data/venue_events.xml +556 -0
  83. data/test/model/data/venue_past_events.xml +1778 -0
  84. data/test/model/data/venue_search.xml +355 -0
  85. data/test/model/event_test.rb +63 -0
  86. data/test/model/group_test.rb +45 -0
  87. data/test/model/location_test.rb +25 -0
  88. data/test/model/playlist_test.rb +51 -0
  89. data/test/model/shout_test.rb +23 -0
  90. data/test/model/tag_test.rb +39 -0
  91. data/test/model/track_test.rb +67 -0
  92. data/test/model/user_test.rb +125 -0
  93. data/test/model/venue_test.rb +60 -0
  94. data/test/provider/album_provider_test.rb +26 -0
  95. data/test/provider/artist_provider_test.rb +25 -0
  96. data/test/provider/group_provider_test.rb +9 -0
  97. data/test/provider/location_provider_test.rb +9 -0
  98. data/test/provider/playlist_provider_test.rb +12 -0
  99. data/test/provider/tag_provider_test.rb +24 -0
  100. data/test/provider/track_provider_test.rb +26 -0
  101. data/test/provider/user_provider_test.rb +11 -0
  102. data/test/provider/venue_provider_test.rb +15 -0
  103. data/test/provider_test_helper.rb +27 -0
  104. data/test/remote_test.rb +26 -0
  105. metadata +209 -0
@@ -0,0 +1,25 @@
1
+ require 'helper'
2
+
3
+ class LocationTest < Test::Unit::TestCase
4
+ include ProviderTestHelper
5
+
6
+ def setup
7
+ super
8
+ @location = StubSession.new.location.build(:country => "United Kingdom", :city => "London")
9
+ end
10
+
11
+ test "has artists" do
12
+ expect_get "method=geo.getTopArtists&country=United%20Kingdom", :artist_search
13
+ assert @location.artists.first.kind_of? Model::Artist
14
+ end
15
+
16
+ test "has tracks" do
17
+ expect_get "method=geo.getTopTracks&country=United%20Kingdom&location=London", :track_search
18
+ assert @location.tracks.first.kind_of? Model::Track
19
+ end
20
+
21
+ test "has events" do
22
+ expect_get "method=geo.getEvents&location=London", :location_events
23
+ assert @location.events.first.kind_of? Model::Event
24
+ end
25
+ end
@@ -0,0 +1,51 @@
1
+ require 'helper'
2
+
3
+ class PlaylistTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ def setup
7
+ super
8
+ @playlist = Model::Playlist.parse(xml("user_playlists"), :single => true)
9
+ end
10
+
11
+ test "has id" do
12
+ assert_equal 1011557, @playlist.id
13
+ end
14
+
15
+ test "has a title" do
16
+ assert_equal "knaveofdiamonds\342\200\231s playlist", @playlist.title
17
+ end
18
+
19
+ test "has a description" do
20
+ assert_equal "a description", @playlist.description
21
+ end
22
+
23
+ test "has a creation time" do
24
+ assert_equal Time.local(2007, 8, 23, 22, 4, 33), @playlist.created_at
25
+ end
26
+
27
+ test "has a size" do
28
+ assert_equal 27, @playlist.size
29
+ end
30
+
31
+ test "has a total duration" do
32
+ assert_equal 7487, @playlist.duration
33
+ end
34
+
35
+ test "can be streamable" do
36
+ assert ! @playlist.streamable?
37
+ end
38
+
39
+ test "has a url" do
40
+ assert_equal "http://www.last.fm/user/knaveofdiamonds/library/playlists/loit_knaveofdiamonds%25E2%2580%2599s_playlist", @playlist.url
41
+ end
42
+
43
+ test "can have tracks added to it" do
44
+ @facade.stubs(:session => stub(:playlist_facade => @facade))
45
+ @playlist.session = @facade.session
46
+ @facade.expects(:add_track).with(1011557, "Title", "Artist").returns(xml("ok"))
47
+ track = stub(:name => "Title", :artist_name => "Artist")
48
+
49
+ @playlist.add_track(track)
50
+ end
51
+ end
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+
3
+ class ShoutTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ def setup
7
+ super
8
+ @shout = Model::Shout.parse(xml("artist_shouts"), :single => true)
9
+ @shout.session = StubSession.new
10
+ end
11
+
12
+ test "has a message" do
13
+ assert @shout.message
14
+ end
15
+
16
+ test "has a time" do
17
+ assert_equal Time.local(2009, 5, 13, 3, 58, 30), @shout.time
18
+ end
19
+
20
+ test "has an author" do
21
+ assert_equal "distantfingers", @shout.user.name
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ require 'helper'
2
+
3
+ class TagTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ def setup
7
+ super
8
+ @tag = Model::Tag.parse("<tag><name>disco</name></tag>")
9
+ @tag.session = StubSession.new
10
+ end
11
+
12
+ test "can be parsed from xml" do
13
+ parsed = Model::Tag.parse(xml("tag_search"))
14
+ assert_equal 20, parsed.size
15
+ assert_equal 75545, parsed.first.count
16
+ assert_equal "disco", parsed.first.name
17
+ assert_equal "www.last.fm/tag/disco", parsed.first.url
18
+ end
19
+
20
+ test "has similar tags" do
21
+ expect_get "method=tag.getSimilar&tag=disco", :tag_similar
22
+ assert @tag.similar.first.kind_of? Model::Tag
23
+ end
24
+
25
+ test "has artists" do
26
+ expect_get "method=tag.getTopArtists&tag=disco", :tag_top_artists
27
+ assert @tag.artists.first.kind_of? Model::Artist
28
+ end
29
+
30
+ test "has albums" do
31
+ expect_get "method=tag.getTopAlbums&tag=disco", :tag_top_albums
32
+ assert @tag.albums.first.kind_of? Model::Album
33
+ end
34
+
35
+ test "has tracks" do
36
+ expect_get "method=tag.getTopTracks&tag=disco", :tag_top_tracks
37
+ assert @tag.tracks.first.kind_of? Model::Track
38
+ end
39
+ end
@@ -0,0 +1,67 @@
1
+ require 'helper'
2
+
3
+ class TrackTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ def setup
7
+ super
8
+ @track = Model::Track.parse(xml("track_info"), :single => true)
9
+ @track.session = StubSession.new
10
+ end
11
+
12
+ test "has a name" do
13
+ assert_equal "Stairway to Heaven", @track.name
14
+ end
15
+
16
+ test "has an id" do
17
+ assert_equal 12729, @track.id
18
+ end
19
+
20
+ test "has listeners" do
21
+ assert_equal 514346, @track.listeners
22
+ end
23
+
24
+ test "has a url" do
25
+ assert_equal "http://www.last.fm/music/Led+Zeppelin/_/Stairway+to+Heaven", @track.url
26
+ end
27
+
28
+ test "has a play count" do
29
+ assert_equal 3438976, @track.play_count
30
+ end
31
+
32
+ test "can be streamable" do
33
+ assert @track.streamable?
34
+ end
35
+
36
+ test "has a duration in milliseconds" do
37
+ assert_equal 478000, @track.duration
38
+ end
39
+
40
+ test "has an artist" do
41
+ assert_equal "Led Zeppelin", @track.artist.name
42
+ end
43
+
44
+ test "has an album" do
45
+ assert_equal "Led Zeppelin IV", @track.album.name
46
+ end
47
+
48
+ test "has user tags" do
49
+ expect_get "method=track.getTags&artist=Led%20Zeppelin&track=Stairway%20to%20Heaven", :tag_search
50
+ assert @track.my_tags.first.kind_of? Model::Tag
51
+ end
52
+
53
+ test "has similar tracks" do
54
+ expect_get "method=track.getSimilar&track=Stairway%20to%20Heaven&artist=Led%20Zeppelin", :track_search
55
+ assert @track.similar.first.kind_of? Model::Track
56
+ end
57
+
58
+ test "has fans" do
59
+ expect_get "method=track.getTopFans&track=Stairway%20to%20Heaven&artist=Led%20Zeppelin", :artist_top_fans
60
+ assert @track.fans.first.kind_of? Model::User
61
+ end
62
+
63
+ test "has tags" do
64
+ expect_get "method=track.getTopTags&track=Stairway%20to%20Heaven&artist=Led%20Zeppelin", :tag_similar
65
+ assert @track.tags.first.kind_of? Model::Tag
66
+ end
67
+ end
@@ -0,0 +1,125 @@
1
+ require 'helper'
2
+
3
+ class UserTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ def setup
7
+ super
8
+ @user = Model::User.parse(xml("user_info"), :single => true)
9
+ @user.session = StubSession.new
10
+ end
11
+
12
+ test "has a name" do
13
+ assert_equal "knaveofdiamonds", @user.name
14
+ end
15
+
16
+ test "has an id" do
17
+ assert_equal 7532711, @user.id
18
+ end
19
+
20
+ test "has a real name" do
21
+ assert_equal "Roland Swingler", @user.real_name
22
+ end
23
+
24
+ test "has a url" do
25
+ assert_equal "http://www.last.fm/user/knaveofdiamonds", @user.url
26
+ end
27
+
28
+ test "has an image" do
29
+ assert_equal "http://userserve-ak.last.fm/serve/126/10636291.jpg", @user.image
30
+ end
31
+
32
+ test "has a language" do
33
+ assert_equal "en", @user.language
34
+ end
35
+
36
+ test "has a country" do
37
+ assert_equal "UK", @user.country
38
+ end
39
+
40
+ test "can be a subscriber" do
41
+ assert_equal false, @user.subscriber
42
+ end
43
+
44
+ test "has a play count" do
45
+ assert_equal 8251, @user.play_count
46
+ end
47
+
48
+ test "has album chart" do
49
+ expect_get "method=user.getWeeklyAlbumChart&user=knaveofdiamonds", :group_weekly_album_chart
50
+ assert_equal 250, @user.album_chart.size
51
+ end
52
+
53
+ test "has artist chart" do
54
+ expect_get "method=user.getWeeklyArtistChart&user=knaveofdiamonds", :group_weekly_artist_chart
55
+ assert_equal 100, @user.artist_chart.size
56
+ end
57
+
58
+ test "has track chart" do
59
+ expect_get "method=user.getWeeklyTrackChart&user=knaveofdiamonds", :group_weekly_track_chart
60
+ assert_equal 100, @user.track_chart.size
61
+ end
62
+
63
+ test "has chart dates" do
64
+ expect_get "method=user.getWeeklyChartList&user=knaveofdiamonds", :tag_weekly_chart_list
65
+ assert_equal 53, @user.chart_dates.size
66
+ end
67
+
68
+ test "has events" do
69
+ expect_get "method=user.getEvents&user=knaveofdiamonds", :venue_events
70
+ assert @user.events.first.kind_of? Model::Event
71
+ end
72
+
73
+ test "has past events" do
74
+ expect_get "method=user.getPastEvents&user=knaveofdiamonds", :venue_events
75
+ assert @user.past_events.first.kind_of? Model::Event
76
+ end
77
+
78
+ test "has recent tracks" do
79
+ expect_get "method=user.getRecentTracks&user=knaveofdiamonds", :user_recent_tracks
80
+ assert @user.recent_tracks.first.kind_of? Model::Track
81
+ end
82
+
83
+ test "has neighbours" do
84
+ expect_get "method=user.getNeighbours&user=knaveofdiamonds", :user_neighbours
85
+ assert @user.neighbours.first.kind_of? Model::User
86
+ end
87
+
88
+ test "has friends" do
89
+ expect_get "method=user.getFriends&user=knaveofdiamonds", :user_neighbours
90
+ assert @user.friends.first.kind_of? Model::User
91
+ end
92
+
93
+ test "has loved tracks" do
94
+ expect_get "method=user.getLovedTracks&user=knaveofdiamonds", :track_search
95
+ assert @user.loved_tracks.first.kind_of? Model::Track
96
+ end
97
+
98
+ test "has playlists" do
99
+ expect_get "method=user.getPlaylists&user=knaveofdiamonds", :user_playlists
100
+ assert @user.playlists.first.kind_of? Model::Playlist
101
+ end
102
+
103
+ test "has shouts" do
104
+ expect_get "method=user.getShouts&user=knaveofdiamonds", :user_shouts
105
+ assert @user.shouts.first.kind_of? Model::Shout
106
+ end
107
+
108
+ # Logged in user only
109
+
110
+ test "has recommended events" do
111
+ expect_get "method=user.getRecommendedEvents", :venue_events
112
+ assert @user.recommended_events.first.kind_of? Model::Event
113
+ end
114
+
115
+ test "has recommended artists" do
116
+ expect_get "method=user.getRecommendedArtists", :user_recommended_artists
117
+ assert @user.recommended_artists.first.kind_of? Model::Artist
118
+ end
119
+
120
+ test "can be compared with other users" do
121
+ other = Model::User.parse("<user><name>other</name></user>")
122
+ expect_get "method=tasteometer.compare&type1=user&type2=user&value1=knaveofdiamonds&value2=other", :tasteometer_compare
123
+ assert @user.compare_with(other).kind_of? Model::Comparison
124
+ end
125
+ end
@@ -0,0 +1,60 @@
1
+ require 'helper'
2
+
3
+ class VenueTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ def setup
7
+ super
8
+ @venue = Model::Venue.parse(xml("venue_search"), :single => true)
9
+ @venue.session = StubSession.new
10
+ end
11
+
12
+ test "venue has a name" do
13
+ assert_equal "Koko", @venue.name
14
+ end
15
+
16
+ test "venue has a city" do
17
+ assert_equal "London", @venue.city
18
+ end
19
+
20
+ test "venue has a country" do
21
+ assert_equal "United Kingdom", @venue.country
22
+ end
23
+
24
+ test "venue has a street address" do
25
+ assert_equal "1a Camden High Street, Camden", @venue.street_address
26
+ end
27
+
28
+ test "venue has a post code" do
29
+ assert_equal "NW1 7JE", @venue.postcode
30
+ end
31
+
32
+ test "venue has a url" do
33
+ assert_equal "http://www.last.fm/venue/8777134", @venue.url
34
+ end
35
+
36
+ test "venue has a location" do
37
+ assert_in_delta 51.53469, @venue.location.latitude, 0.000001
38
+ assert_in_delta -0.138434, @venue.location.longitude, 0.000001
39
+ end
40
+
41
+ test "venue's location has session set" do
42
+ @venue.session = stub()
43
+ assert @venue.instance_variable_get("@session".to_sym)
44
+ assert @venue.location.instance_variable_get("@session".to_sym)
45
+ end
46
+
47
+ test "venue has an id" do
48
+ assert_equal 8777134, @venue.id
49
+ end
50
+
51
+ test "has events" do
52
+ expect_get "method=venue.getEvents&venue=8777134", :venue_events
53
+ assert @venue.events.first.kind_of? Model::Event
54
+ end
55
+
56
+ test "has past events" do
57
+ expect_get "method=venue.getPastEvents&venue=8777134", :venue_events
58
+ assert @venue.past_events.first.kind_of? Model::Event
59
+ end
60
+ end
@@ -0,0 +1,26 @@
1
+ require 'helper'
2
+
3
+ class AlbumProviderTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ test "can get an album by artist and name" do
7
+ expect_get "method=album.getInfo&artist=The%20Feelies&album=Only%20Life", :album_info
8
+ assert_equal "Only Life", StubSession.new.album.get("The Feelies", "Only Life").name
9
+ end
10
+
11
+ test "can get an album by musicbrainz id" do
12
+ expect_get "method=album.getInfo&mbid=464efacc-a133-4ae6-a9ff-7573c448eb32", :album_info
13
+ assert_equal "Only Life", StubSession.new.album.get_by_id("464efacc-a133-4ae6-a9ff-7573c448eb32").name
14
+ end
15
+
16
+ test "can get an album by RBrainz mbid model" do
17
+ expect_get "method=album.getInfo&mbid=464efacc-a133-4ae6-a9ff-7573c448eb32", :album_info
18
+ assert_equal "Only Life", StubSession.new.album.get_by_id(stub(:uuid => "464efacc-a133-4ae6-a9ff-7573c448eb32")).name
19
+ end
20
+
21
+ test "can search for albums by name" do
22
+ expect_get "method=album.search&album=Only%20Life", :album_search
23
+ assert_equal 20, StubSession.new.album.search("Only Life").size
24
+ end
25
+
26
+ end
@@ -0,0 +1,25 @@
1
+ require 'helper'
2
+
3
+ class ArtistProviderTest < TestCase
4
+ include ProviderTestHelper
5
+
6
+ test "can get an artist by name" do
7
+ expect_get "method=artist.getInfo&artist=The%20Feelies", :artist_info
8
+ assert_equal "The Feelies", StubSession.new.artist.get("The Feelies").name
9
+ end
10
+
11
+ test "can get an artist by mbid" do
12
+ expect_get "method=artist.getInfo&mbid=28c07254-aeae-42ad-beea-67f59c3c8baf", :artist_info
13
+ assert_equal "The Feelies", StubSession.new.artist.get_by_id("28c07254-aeae-42ad-beea-67f59c3c8baf").name
14
+ end
15
+
16
+ test "can get an artist by an Rbrainz MBID model via uuid attribute" do
17
+ expect_get "method=artist.getInfo&mbid=28c07254-aeae-42ad-beea-67f59c3c8baf", :artist_info
18
+ assert_equal "The Feelies", StubSession.new.artist.get_by_id(stub(:uuid => "28c07254-aeae-42ad-beea-67f59c3c8baf")).name
19
+ end
20
+
21
+ test "can search for artists by name" do
22
+ expect_get "method=artist.search&artist=The%20Feelies", :artist_search
23
+ assert_equal 11, StubSession.new.artist.search("The Feelies").size
24
+ end
25
+ end