scrobbler2 0.0.4

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 (117) hide show
  1. data/.gitignore +1 -0
  2. data/README.rdoc +155 -0
  3. data/Rakefile +8 -0
  4. data/TODO +23 -0
  5. data/VERSION.yml +4 -0
  6. data/generators/acceptance_test/USAGE +9 -0
  7. data/generators/acceptance_test/acceptance_test_generator.rb +57 -0
  8. data/generators/acceptance_test/templates/acceptance_test.rb.erb +14 -0
  9. data/generators/resource/USAGE +8 -0
  10. data/generators/resource/resource_generator.rb +47 -0
  11. data/generators/resource/templates/resource.rb.erb +11 -0
  12. data/generators/resource/templates/spec.rb.erb +22 -0
  13. data/lib/scrobbler2.rb +23 -0
  14. data/lib/scrobbler2/album.rb +11 -0
  15. data/lib/scrobbler2/artist.rb +26 -0
  16. data/lib/scrobbler2/auth.rb +19 -0
  17. data/lib/scrobbler2/base.rb +100 -0
  18. data/lib/scrobbler2/event.rb +12 -0
  19. data/lib/scrobbler2/geo.rb +15 -0
  20. data/lib/scrobbler2/group.rb +14 -0
  21. data/lib/scrobbler2/library.rb +12 -0
  22. data/lib/scrobbler2/playlist.rb +10 -0
  23. data/lib/scrobbler2/tag.rb +18 -0
  24. data/lib/scrobbler2/track.rb +13 -0
  25. data/lib/scrobbler2/user.rb +29 -0
  26. data/lib/scrobbler2/venue.rb +12 -0
  27. data/script/console +10 -0
  28. data/script/destroy +14 -0
  29. data/script/generate +14 -0
  30. data/scrobbler2.gemspec +243 -0
  31. data/tasks/jeweler.rake +15 -0
  32. data/tasks/rcov.rake +9 -0
  33. data/tasks/rdoc.rake +7 -0
  34. data/tasks/tests.rake +10 -0
  35. data/test/acceptance/album/info_test.rb +56 -0
  36. data/test/acceptance/artist/add_tags_test.rb +14 -0
  37. data/test/acceptance/artist/events_test.rb +47 -0
  38. data/test/acceptance/artist/info_test.rb +53 -0
  39. data/test/acceptance/artist/shouts_test.rb +48 -0
  40. data/test/acceptance/artist/similar_artists_test.rb +20 -0
  41. data/test/acceptance/artist/tags_test.rb +24 -0
  42. data/test/acceptance/artist/top_albums_test.rb +34 -0
  43. data/test/acceptance/artist/top_fans.rb +19 -0
  44. data/test/acceptance/artist/top_tags.rb +18 -0
  45. data/test/acceptance/artist/top_tracks.rb +47 -0
  46. data/test/acceptance/auth/auth_test.rb +21 -0
  47. data/test/acceptance/event/info_test.rb +66 -0
  48. data/test/acceptance/event/shouts_test.rb +49 -0
  49. data/test/acceptance/geo/events_test.rb +14 -0
  50. data/test/acceptance/geo/top_artists_test.rb +16 -0
  51. data/test/acceptance/geo/top_tracks_test.rb +16 -0
  52. data/test/acceptance/group/members_test.rb +60 -0
  53. data/test/acceptance/group/weekly_album_chart_test.rb +61 -0
  54. data/test/acceptance/group/weekly_artist_chart_test.rb +54 -0
  55. data/test/acceptance/group/weekly_chart_list_test.rb +39 -0
  56. data/test/acceptance/group/weekly_track_chart_test.rb +61 -0
  57. data/test/acceptance/library/albums_test.rb +34 -0
  58. data/test/acceptance/library/artists_test.rb +33 -0
  59. data/test/acceptance/library/tracks_test.rb +33 -0
  60. data/test/acceptance/playlist/fetch_test.rb +68 -0
  61. data/test/acceptance/shared/album.rb +41 -0
  62. data/test/acceptance/shared/artist.rb +16 -0
  63. data/test/acceptance/shared/paged_result.rb +16 -0
  64. data/test/acceptance/shared/top_fans.rb +29 -0
  65. data/test/acceptance/shared/top_tags.rb +23 -0
  66. data/test/acceptance/shared/track.rb +23 -0
  67. data/test/acceptance/tag/similar_test.rb +15 -0
  68. data/test/acceptance/tag/top_albums_test.rb +37 -0
  69. data/test/acceptance/tag/top_artists_test.rb +31 -0
  70. data/test/acceptance/tag/top_tags_test.rb +32 -0
  71. data/test/acceptance/tag/top_tracks_test.rb +33 -0
  72. data/test/acceptance/tag/weekly_artist_chart.rb +54 -0
  73. data/test/acceptance/tag/weekly_chart_list.rb +39 -0
  74. data/test/acceptance/test_helper.rb +15 -0
  75. data/test/acceptance/track/info_test.rb +47 -0
  76. data/test/acceptance/track/similar_test.rb +22 -0
  77. data/test/acceptance/track/top_fans_test.rb +23 -0
  78. data/test/acceptance/track/top_tags_test.rb +24 -0
  79. data/test/acceptance/user/events_test.rb +27 -0
  80. data/test/acceptance/user/friends_test.rb +14 -0
  81. data/test/acceptance/user/info_test.rb +19 -0
  82. data/test/acceptance/user/loved_tracks_test.rb +14 -0
  83. data/test/acceptance/user/neighbours_test.rb +14 -0
  84. data/test/acceptance/user/past_events_test.rb +14 -0
  85. data/test/acceptance/user/playlists_test.rb +14 -0
  86. data/test/acceptance/user/recent_tracks_test.rb +14 -0
  87. data/test/acceptance/user/recommended_artists_test.rb +16 -0
  88. data/test/acceptance/user/recommended_events_test.rb +16 -0
  89. data/test/acceptance/user/shouts_test.rb +14 -0
  90. data/test/acceptance/user/top_albums_test.rb +14 -0
  91. data/test/acceptance/user/top_artists_test.rb +14 -0
  92. data/test/acceptance/user/top_tags_test.rb +14 -0
  93. data/test/acceptance/user/top_tracks_test.rb +14 -0
  94. data/test/acceptance/user/weekly_album_chart_test.rb +14 -0
  95. data/test/acceptance/user/weekly_artist_chart_test.rb +14 -0
  96. data/test/acceptance/user/weekly_chart_list_test.rb +14 -0
  97. data/test/acceptance/user/weekly_track_chart_test.rb +14 -0
  98. data/test/acceptance/venue/events_test.rb +14 -0
  99. data/test/acceptance/venue/past_events_test.rb +14 -0
  100. data/test/generators/test_acceptance_test_generator.rb +46 -0
  101. data/test/generators/test_generator_helper.rb +29 -0
  102. data/test/generators/test_resource_generator.rb +71 -0
  103. data/test/unit/album_spec.rb +17 -0
  104. data/test/unit/artist_spec.rb +62 -0
  105. data/test/unit/auth_spec.rb +22 -0
  106. data/test/unit/base_spec.rb +193 -0
  107. data/test/unit/event_spec.rb +23 -0
  108. data/test/unit/geo_spec.rb +36 -0
  109. data/test/unit/group_spec.rb +38 -0
  110. data/test/unit/library_spec.rb +27 -0
  111. data/test/unit/playlist_spec.rb +18 -0
  112. data/test/unit/spec_helper.rb +7 -0
  113. data/test/unit/tag_spec.rb +50 -0
  114. data/test/unit/track_spec.rb +33 -0
  115. data/test/unit/user_spec.rb +148 -0
  116. data/test/unit/venue_spec.rb +29 -0
  117. metadata +272 -0
@@ -0,0 +1,19 @@
1
+ module Scrobbler2
2
+ class Auth < Base
3
+
4
+ def token
5
+ return @token if @token
6
+ @token = self.class.get_with_auth("auth.gettoken")["lfm"]["token"]
7
+ end
8
+
9
+ def url
10
+ "http://www.last.fm/api/auth/?api_key=#{api_key}&token=#{token}"
11
+ end
12
+
13
+ def session
14
+ return @session if @session
15
+ @session = self.class.get_with_auth("auth.getsession", {:token => token})["lfm"]["session"]
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,100 @@
1
+
2
+
3
+ module Scrobbler2
4
+ class Base
5
+ cattr_accessor :api_key
6
+ cattr_accessor :api_secret
7
+ cattr_accessor :session_key
8
+
9
+ def self.get(method, query={}, options={})
10
+ query = query.merge({:api_key => api_key, :method => method, :format => 'json'})
11
+ options = options.merge({:query => query})
12
+
13
+ response = HTTParty.get('http://ws.audioscrobbler.com/2.0/', options)
14
+ end
15
+
16
+ def self.has_resource(name, options = {})
17
+ define_method name do |*args|
18
+ query = args[1] || {}
19
+ local_options = args[0] || {}
20
+ local_value = instance_variable_get("@#{name.to_s}")
21
+ return local_value if local_value && !options[:force]
22
+
23
+ if options[:query]
24
+ query.merge!(options[:query])
25
+ elsif @query
26
+ query.merge!(@query)
27
+ end
28
+
29
+ method_name = options[:resource_name] || self.class.name.split("::").last.downcase + ".get#{name.to_s.tr('_', '').downcase}"
30
+ if options[:auth]
31
+ value = self.class.get_with_auth(method_name, query, local_options)
32
+ else
33
+ value = self.class.get(method_name, query, local_options)
34
+ end
35
+ value = value[options[:root]] if options[:root]
36
+
37
+ instance_variable_set("@#{name}", value)
38
+ end
39
+ end
40
+
41
+ # TODO this needs to be DRYed up, wrt has_resource
42
+ def self.has_singleton_resource(name, options={})
43
+ (class << self; self; end).class_eval do
44
+ define_method(name) do |*args|
45
+ query = args[1] || {}
46
+ local_options = args[0] || {}
47
+ local_value = instance_variable_get("@#{name.to_s}")
48
+ return local_value if local_value && !options[:force]
49
+
50
+ query.merge!(options[:query]) if options[:query]
51
+
52
+ method_name = options[:resource_name] || self.name.split("::").last.downcase + ".get#{name.to_s.tr('_', '').downcase}"
53
+ if options[:auth]
54
+ value = self.get_with_auth(method_name, query, local_options)
55
+ else
56
+ value = self.get(method_name, query, local_options)
57
+ end
58
+ value = value[options[:root]] if options[:root]
59
+
60
+ instance_variable_set("@#{name}", value)
61
+ end
62
+ end
63
+ end
64
+
65
+ #implements signed requests
66
+ def self.get_with_auth(method, query={}, options={})
67
+ http_with_auth(:get, method, query, options)["lfm"]
68
+ end
69
+
70
+ def self.http_with_auth(http_method, method, query={}, options={})
71
+ query = query.merge({:api_key => api_key, :method => method})
72
+ query = query.merge({:sk => session_key}) if session_key
73
+
74
+ signature = sign(query)
75
+ query = query.merge({:api_sig => signature})
76
+
77
+ if(http_method == :get)
78
+ options = options.merge({:query => query})
79
+ else
80
+ options = options.merge({:body => query})
81
+ end
82
+ response = HTTParty.send(http_method, 'http://ws.audioscrobbler.com/2.0/', options)
83
+ end
84
+
85
+ def self.post_with_auth(method, query={}, options={})
86
+ http_with_auth(:post, method, query, options)
87
+ end
88
+
89
+ def self.sign(query)
90
+ signature = query_signature(query)
91
+ md5 = Digest::MD5.hexdigest(signature)
92
+ end
93
+
94
+ def self.query_signature(query)
95
+ signature = query.sort {|a,b| a[0].to_s <=> b[0].to_s }.map { |param| param.join('') }.join('')
96
+ signature = "#{signature}#{api_secret}"
97
+ signature
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,12 @@
1
+ module Scrobbler2
2
+ class Event < Base
3
+
4
+ def initialize(event_id)
5
+ @query = {:event => event_id}
6
+ end
7
+
8
+ has_resource :info, :root => 'event'
9
+ has_resource :shouts, :root => 'shouts'
10
+
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ module Scrobbler2
2
+ class Geo < Base
3
+
4
+ def initialize()
5
+ @query = {}#TODO eg. {:artist => artist, :track => track}
6
+ end
7
+
8
+ has_resource :events, :root => "events"
9
+
10
+ has_resource :top_artists, :root => "topartists"
11
+
12
+ has_resource :top_tracks, :root => "toptracks"
13
+
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module Scrobbler2
2
+ class Group < Base
3
+
4
+ def initialize(group_name)
5
+ @query = {:group => group_name}
6
+ end
7
+
8
+ has_resource :members, :root => 'members'
9
+ has_resource :weekly_album_chart, :root => 'weeklyalbumchart'
10
+ has_resource :weekly_artist_chart, :root => 'weeklyartistchart'
11
+ has_resource :weekly_track_chart, :root => 'weeklytrackchart'
12
+ has_resource :weekly_chart_list, :root => 'weeklychartlist'
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module Scrobbler2
2
+ class Library < Base
3
+
4
+ def initialize(user)
5
+ @query = {:user => user}
6
+ end
7
+
8
+ has_resource :artists, :root => 'artists'
9
+ has_resource :albums, :root => 'albums'
10
+ has_resource :tracks, :root => 'tracks'
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Scrobbler2
2
+ class Playlist < Base
3
+
4
+ def initialize(playlist_url)
5
+ @query = {:playlistURL => playlist_url}
6
+ end
7
+
8
+ has_resource :fetch, :root => 'playlist', :resource_name => 'playlist.fetch'
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module Scrobbler2
3
+ class Tag < Base
4
+
5
+ def initialize(tag)
6
+ @query = {:tag => tag}
7
+ end
8
+
9
+ has_singleton_resource :top_tags, :root => 'toptags'
10
+ has_resource :similar, :root => 'similar'
11
+ has_resource :top_artists, :root => 'topartists'
12
+ has_resource :top_albums, :root => 'topalbums'
13
+ has_resource :top_tracks, :root => 'toptracks'
14
+ has_resource :weekly_artist_chart, :root => 'weeklyartistchart'
15
+ has_resource :weekly_chart_list, :root => 'weeklychartlist'
16
+
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Scrobbler2
2
+ class Track < Base
3
+
4
+ def initialize(artist, track)
5
+ @query = {:artist => artist, :track => track}
6
+ end
7
+
8
+ has_resource :info, :root => 'track'
9
+ has_resource :similar, :root => 'similartracks'
10
+ has_resource :top_fans, :root => 'topfans'
11
+ has_resource :top_tags, :root => 'toptags'
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ module Scrobbler2
2
+ class User < Base
3
+
4
+ def initialize(username)
5
+ @query = {:user => username}
6
+ end
7
+
8
+ has_resource :events, :root => "events"
9
+ has_resource :info, :root=>"user", :auth=>true, :query => {}
10
+ has_resource :friends, :root => "friends"
11
+ has_resource :loved_tracks, :root => "lovedtracks"
12
+ has_resource :neighbours, :root => "neighbours"
13
+ has_resource :past_events, :root => "events"
14
+ has_resource :playlists, :root => "playlists"
15
+ has_resource :recent_tracks, :root => "recenttracks"
16
+ has_resource :recommended_artists, :root => "recommendedartists", :auth => true, :query => {}
17
+ has_resource :recommended_events, :root => "recommendedevents", :auth => true, :query => {}
18
+ has_resource :shouts, :root => "shouts"
19
+ has_resource :top_albums, :root => "topalbums"
20
+ has_resource :top_artists, :root => "topartists"
21
+ has_resource :top_tags, :root => "toptags"
22
+ has_resource :top_tracks, :root => "toptracks"
23
+ has_resource :weekly_album_chart, :root => "weeklyalbumchart"
24
+ has_resource :weekly_artist_chart, :root => "weeklyartistchart"
25
+ has_resource :weekly_chart_list, :root => "weeklychartlist"
26
+ has_resource :weekly_track_chart, :root => "weeklytrackchart"
27
+
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ module Scrobbler2
2
+ class Venue < Base
3
+
4
+ def initialize(id)
5
+ @query = {:venue => id}
6
+ end
7
+
8
+ has_resource :events, :root => "events"
9
+ has_resource :past_events, :root => "events"
10
+
11
+ end
12
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/scrobbler2.rb'}"
9
+ puts "Loading scrobbler2 gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,243 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{scrobbler2}
8
+ s.version = "0.0.4"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Gareth Andrew", "Kurt Schrader"]
12
+ s.date = %q{2010-01-12}
13
+ s.description = %q{A ruby library for accessing the last.fm v2 webservices}
14
+ s.email = %q{gingerhendrix@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc",
17
+ "TODO"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "README.rdoc",
22
+ "Rakefile",
23
+ "TODO",
24
+ "VERSION.yml",
25
+ "generators/acceptance_test/USAGE",
26
+ "generators/acceptance_test/acceptance_test_generator.rb",
27
+ "generators/acceptance_test/templates/acceptance_test.rb.erb",
28
+ "generators/resource/USAGE",
29
+ "generators/resource/resource_generator.rb",
30
+ "generators/resource/templates/resource.rb.erb",
31
+ "generators/resource/templates/spec.rb.erb",
32
+ "lib/scrobbler2.rb",
33
+ "lib/scrobbler2/album.rb",
34
+ "lib/scrobbler2/artist.rb",
35
+ "lib/scrobbler2/auth.rb",
36
+ "lib/scrobbler2/base.rb",
37
+ "lib/scrobbler2/event.rb",
38
+ "lib/scrobbler2/geo.rb",
39
+ "lib/scrobbler2/group.rb",
40
+ "lib/scrobbler2/library.rb",
41
+ "lib/scrobbler2/playlist.rb",
42
+ "lib/scrobbler2/tag.rb",
43
+ "lib/scrobbler2/track.rb",
44
+ "lib/scrobbler2/user.rb",
45
+ "lib/scrobbler2/venue.rb",
46
+ "script/console",
47
+ "script/destroy",
48
+ "script/generate",
49
+ "scrobbler2.gemspec",
50
+ "tasks/jeweler.rake",
51
+ "tasks/rcov.rake",
52
+ "tasks/rdoc.rake",
53
+ "tasks/tests.rake",
54
+ "test/acceptance/album/info_test.rb",
55
+ "test/acceptance/artist/add_tags_test.rb",
56
+ "test/acceptance/artist/events_test.rb",
57
+ "test/acceptance/artist/info_test.rb",
58
+ "test/acceptance/artist/shouts_test.rb",
59
+ "test/acceptance/artist/similar_artists_test.rb",
60
+ "test/acceptance/artist/tags_test.rb",
61
+ "test/acceptance/artist/top_albums_test.rb",
62
+ "test/acceptance/artist/top_fans.rb",
63
+ "test/acceptance/artist/top_tags.rb",
64
+ "test/acceptance/artist/top_tracks.rb",
65
+ "test/acceptance/auth/auth_test.rb",
66
+ "test/acceptance/event/info_test.rb",
67
+ "test/acceptance/event/shouts_test.rb",
68
+ "test/acceptance/geo/events_test.rb",
69
+ "test/acceptance/geo/top_artists_test.rb",
70
+ "test/acceptance/geo/top_tracks_test.rb",
71
+ "test/acceptance/group/members_test.rb",
72
+ "test/acceptance/group/weekly_album_chart_test.rb",
73
+ "test/acceptance/group/weekly_artist_chart_test.rb",
74
+ "test/acceptance/group/weekly_chart_list_test.rb",
75
+ "test/acceptance/group/weekly_track_chart_test.rb",
76
+ "test/acceptance/library/albums_test.rb",
77
+ "test/acceptance/library/artists_test.rb",
78
+ "test/acceptance/library/tracks_test.rb",
79
+ "test/acceptance/playlist/fetch_test.rb",
80
+ "test/acceptance/shared/album.rb",
81
+ "test/acceptance/shared/artist.rb",
82
+ "test/acceptance/shared/paged_result.rb",
83
+ "test/acceptance/shared/top_fans.rb",
84
+ "test/acceptance/shared/top_tags.rb",
85
+ "test/acceptance/shared/track.rb",
86
+ "test/acceptance/tag/similar_test.rb",
87
+ "test/acceptance/tag/top_albums_test.rb",
88
+ "test/acceptance/tag/top_artists_test.rb",
89
+ "test/acceptance/tag/top_tags_test.rb",
90
+ "test/acceptance/tag/top_tracks_test.rb",
91
+ "test/acceptance/tag/weekly_artist_chart.rb",
92
+ "test/acceptance/tag/weekly_chart_list.rb",
93
+ "test/acceptance/test_helper.rb",
94
+ "test/acceptance/track/info_test.rb",
95
+ "test/acceptance/track/similar_test.rb",
96
+ "test/acceptance/track/top_fans_test.rb",
97
+ "test/acceptance/track/top_tags_test.rb",
98
+ "test/acceptance/user/events_test.rb",
99
+ "test/acceptance/user/friends_test.rb",
100
+ "test/acceptance/user/info_test.rb",
101
+ "test/acceptance/user/loved_tracks_test.rb",
102
+ "test/acceptance/user/neighbours_test.rb",
103
+ "test/acceptance/user/past_events_test.rb",
104
+ "test/acceptance/user/playlists_test.rb",
105
+ "test/acceptance/user/recent_tracks_test.rb",
106
+ "test/acceptance/user/recommended_artists_test.rb",
107
+ "test/acceptance/user/recommended_events_test.rb",
108
+ "test/acceptance/user/shouts_test.rb",
109
+ "test/acceptance/user/top_albums_test.rb",
110
+ "test/acceptance/user/top_artists_test.rb",
111
+ "test/acceptance/user/top_tags_test.rb",
112
+ "test/acceptance/user/top_tracks_test.rb",
113
+ "test/acceptance/user/weekly_album_chart_test.rb",
114
+ "test/acceptance/user/weekly_artist_chart_test.rb",
115
+ "test/acceptance/user/weekly_chart_list_test.rb",
116
+ "test/acceptance/user/weekly_track_chart_test.rb",
117
+ "test/acceptance/venue/events_test.rb",
118
+ "test/acceptance/venue/past_events_test.rb",
119
+ "test/generators/test_acceptance_test_generator.rb",
120
+ "test/generators/test_generator_helper.rb",
121
+ "test/generators/test_resource_generator.rb",
122
+ "test/unit/album_spec.rb",
123
+ "test/unit/artist_spec.rb",
124
+ "test/unit/auth_spec.rb",
125
+ "test/unit/base_spec.rb",
126
+ "test/unit/event_spec.rb",
127
+ "test/unit/geo_spec.rb",
128
+ "test/unit/group_spec.rb",
129
+ "test/unit/library_spec.rb",
130
+ "test/unit/playlist_spec.rb",
131
+ "test/unit/spec_helper.rb",
132
+ "test/unit/tag_spec.rb",
133
+ "test/unit/track_spec.rb",
134
+ "test/unit/user_spec.rb",
135
+ "test/unit/venue_spec.rb"
136
+ ]
137
+ s.homepage = %q{http://github.com/gingerhendrix/scrobbler2}
138
+ s.rdoc_options = ["--charset=UTF-8"]
139
+ s.require_paths = ["lib"]
140
+ s.rubygems_version = %q{1.3.5}
141
+ s.summary = %q{A ruby library for accessing the last.fm v2 webservices}
142
+ s.test_files = [
143
+ "test/acceptance/album/info_test.rb",
144
+ "test/acceptance/artist/add_tags_test.rb",
145
+ "test/acceptance/artist/events_test.rb",
146
+ "test/acceptance/artist/info_test.rb",
147
+ "test/acceptance/artist/shouts_test.rb",
148
+ "test/acceptance/artist/similar_artists_test.rb",
149
+ "test/acceptance/artist/tags_test.rb",
150
+ "test/acceptance/artist/top_albums_test.rb",
151
+ "test/acceptance/artist/top_fans.rb",
152
+ "test/acceptance/artist/top_tags.rb",
153
+ "test/acceptance/artist/top_tracks.rb",
154
+ "test/acceptance/auth/auth_test.rb",
155
+ "test/acceptance/event/info_test.rb",
156
+ "test/acceptance/event/shouts_test.rb",
157
+ "test/acceptance/geo/events_test.rb",
158
+ "test/acceptance/geo/top_artists_test.rb",
159
+ "test/acceptance/geo/top_tracks_test.rb",
160
+ "test/acceptance/group/members_test.rb",
161
+ "test/acceptance/group/weekly_album_chart_test.rb",
162
+ "test/acceptance/group/weekly_artist_chart_test.rb",
163
+ "test/acceptance/group/weekly_chart_list_test.rb",
164
+ "test/acceptance/group/weekly_track_chart_test.rb",
165
+ "test/acceptance/library/albums_test.rb",
166
+ "test/acceptance/library/artists_test.rb",
167
+ "test/acceptance/library/tracks_test.rb",
168
+ "test/acceptance/playlist/fetch_test.rb",
169
+ "test/acceptance/shared/album.rb",
170
+ "test/acceptance/shared/artist.rb",
171
+ "test/acceptance/shared/paged_result.rb",
172
+ "test/acceptance/shared/top_fans.rb",
173
+ "test/acceptance/shared/top_tags.rb",
174
+ "test/acceptance/shared/track.rb",
175
+ "test/acceptance/tag/similar_test.rb",
176
+ "test/acceptance/tag/top_albums_test.rb",
177
+ "test/acceptance/tag/top_artists_test.rb",
178
+ "test/acceptance/tag/top_tags_test.rb",
179
+ "test/acceptance/tag/top_tracks_test.rb",
180
+ "test/acceptance/tag/weekly_artist_chart.rb",
181
+ "test/acceptance/tag/weekly_chart_list.rb",
182
+ "test/acceptance/test_helper.rb",
183
+ "test/acceptance/track/info_test.rb",
184
+ "test/acceptance/track/similar_test.rb",
185
+ "test/acceptance/track/top_fans_test.rb",
186
+ "test/acceptance/track/top_tags_test.rb",
187
+ "test/acceptance/user/events_test.rb",
188
+ "test/acceptance/user/friends_test.rb",
189
+ "test/acceptance/user/info_test.rb",
190
+ "test/acceptance/user/loved_tracks_test.rb",
191
+ "test/acceptance/user/neighbours_test.rb",
192
+ "test/acceptance/user/past_events_test.rb",
193
+ "test/acceptance/user/playlists_test.rb",
194
+ "test/acceptance/user/recent_tracks_test.rb",
195
+ "test/acceptance/user/recommended_artists_test.rb",
196
+ "test/acceptance/user/recommended_events_test.rb",
197
+ "test/acceptance/user/shouts_test.rb",
198
+ "test/acceptance/user/top_albums_test.rb",
199
+ "test/acceptance/user/top_artists_test.rb",
200
+ "test/acceptance/user/top_tags_test.rb",
201
+ "test/acceptance/user/top_tracks_test.rb",
202
+ "test/acceptance/user/weekly_album_chart_test.rb",
203
+ "test/acceptance/user/weekly_artist_chart_test.rb",
204
+ "test/acceptance/user/weekly_chart_list_test.rb",
205
+ "test/acceptance/user/weekly_track_chart_test.rb",
206
+ "test/acceptance/venue/events_test.rb",
207
+ "test/acceptance/venue/past_events_test.rb",
208
+ "test/generators/test_acceptance_test_generator.rb",
209
+ "test/generators/test_generator_helper.rb",
210
+ "test/generators/test_resource_generator.rb",
211
+ "test/unit/album_spec.rb",
212
+ "test/unit/artist_spec.rb",
213
+ "test/unit/auth_spec.rb",
214
+ "test/unit/base_spec.rb",
215
+ "test/unit/event_spec.rb",
216
+ "test/unit/geo_spec.rb",
217
+ "test/unit/group_spec.rb",
218
+ "test/unit/library_spec.rb",
219
+ "test/unit/playlist_spec.rb",
220
+ "test/unit/spec_helper.rb",
221
+ "test/unit/tag_spec.rb",
222
+ "test/unit/track_spec.rb",
223
+ "test/unit/user_spec.rb",
224
+ "test/unit/venue_spec.rb"
225
+ ]
226
+
227
+ if s.respond_to? :specification_version then
228
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
229
+ s.specification_version = 3
230
+
231
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
232
+ s.add_runtime_dependency(%q<httparty>, [">= 0.2.2"])
233
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
234
+ else
235
+ s.add_dependency(%q<httparty>, [">= 0.2.2"])
236
+ s.add_dependency(%q<activesupport>, [">= 0"])
237
+ end
238
+ else
239
+ s.add_dependency(%q<httparty>, [">= 0.2.2"])
240
+ s.add_dependency(%q<activesupport>, [">= 0"])
241
+ end
242
+ end
243
+