hallon 0.4.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/.gitmodules +3 -0
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG +30 -6
  4. data/README.markdown +7 -7
  5. data/Rakefile +70 -16
  6. data/examples/logging_in.rb +3 -3
  7. data/examples/printing_link_information.rb +1 -1
  8. data/examples/show_published_playlists_of_user.rb +92 -0
  9. data/hallon.gemspec +7 -4
  10. data/lib/hallon.rb +16 -4
  11. data/lib/hallon/album.rb +16 -6
  12. data/lib/hallon/album_browse.rb +78 -0
  13. data/lib/hallon/artist.rb +59 -0
  14. data/lib/hallon/artist_browse.rb +89 -0
  15. data/lib/hallon/base.rb +7 -0
  16. data/lib/hallon/enumerator.rb +64 -0
  17. data/lib/hallon/error.rb +8 -6
  18. data/lib/hallon/ext/spotify.rb +3 -3
  19. data/lib/hallon/image.rb +25 -12
  20. data/lib/hallon/link.rb +4 -4
  21. data/lib/hallon/linkable.rb +4 -2
  22. data/lib/hallon/observable.rb +1 -4
  23. data/lib/hallon/player.rb +130 -0
  24. data/lib/hallon/search.rb +128 -0
  25. data/lib/hallon/session.rb +226 -25
  26. data/lib/hallon/toplist.rb +83 -0
  27. data/lib/hallon/track.rb +62 -7
  28. data/lib/hallon/user.rb +6 -6
  29. data/lib/hallon/version.rb +1 -1
  30. data/spec/hallon/album_browse_spec.rb +20 -0
  31. data/spec/hallon/album_spec.rb +12 -7
  32. data/spec/hallon/artist_browse_spec.rb +29 -0
  33. data/spec/hallon/artist_spec.rb +32 -0
  34. data/spec/hallon/enumerator_spec.rb +106 -0
  35. data/spec/hallon/error_spec.rb +10 -0
  36. data/spec/hallon/hallon_spec.rb +5 -1
  37. data/spec/hallon/image_spec.rb +39 -25
  38. data/spec/hallon/linkable_spec.rb +12 -4
  39. data/spec/hallon/observable_spec.rb +5 -0
  40. data/spec/hallon/player_spec.rb +73 -0
  41. data/spec/hallon/search_spec.rb +80 -0
  42. data/spec/hallon/session_spec.rb +187 -6
  43. data/spec/hallon/toplist_spec.rb +40 -0
  44. data/spec/hallon/track_spec.rb +43 -8
  45. data/spec/mockspotify.rb +47 -0
  46. data/spec/mockspotify/.gitignore +5 -0
  47. data/spec/mockspotify/extconf.rb +5 -0
  48. data/spec/mockspotify/mockspotify_spec.rb +41 -0
  49. data/spec/spec_helper.rb +20 -0
  50. data/spec/support/common_objects.rb +84 -7
  51. metadata +72 -20
  52. data/lib/hallon/ext/object.rb +0 -16
@@ -0,0 +1,40 @@
1
+ describe Hallon::Toplist do
2
+ subject do
3
+ mock_session do
4
+ Spotify.should_receive(:toplistbrowse_create).and_return(mock_toplistbrowse)
5
+ Hallon::Toplist.new(:artists)
6
+ end
7
+ end
8
+
9
+ it { should be_a Hallon::Observable }
10
+ it { should be_loaded }
11
+ its(:error) { should eq :ok }
12
+
13
+ its('artists.size') { should eq 2 }
14
+ its('artists.to_a') { should eq instantiate(Hallon::Artist, mock_artist, mock_artist_two) }
15
+
16
+ its('albums.size') { should eq 1 }
17
+ its('albums.to_a') { should eq instantiate(Hallon::Album, mock_album) }
18
+
19
+ its('tracks.size') { should eq 2 }
20
+ its('tracks.to_a') { should eq instantiate(Hallon::Track, mock_track, mock_track_two) }
21
+
22
+ describe ".new" do
23
+ around { |test| mock_session(&test) }
24
+
25
+ it "should fail given an invalid type" do
26
+ expect { Hallon::Toplist.new(:invalid_type) }.to raise_error(ArgumentError, /invalid enum value/)
27
+ end
28
+
29
+ it "should pass the username given a string to libspotify" do
30
+ Spotify.should_receive(:toplistbrowse_create).with(anything, anything, :user, "Kim", anything, nil).and_return(null_pointer)
31
+ Hallon::Toplist.new(:artists, "Kim")
32
+ end
33
+
34
+ it "should pass the correct region to libspotify" do
35
+ sweden = 21317
36
+ Spotify.should_receive(:toplistbrowse_create).with(anything, anything, sweden, anything, anything, nil).and_return(null_pointer)
37
+ Hallon::Toplist.new(:artists, :se)
38
+ end
39
+ end
40
+ end
@@ -1,19 +1,49 @@
1
1
  # coding: utf-8
2
- describe Hallon::Track, :session => true do
2
+ describe Hallon::Track do
3
3
  subject { Hallon::Track.new(mock_track) }
4
4
 
5
+ it { should be_loaded }
5
6
  its(:name) { should eq "They" }
6
7
  its(:disc) { should be 2 }
7
8
  its(:index) { should be 7 }
8
9
  its(:status) { should be :ok }
9
-
10
- its(:duration) { should eq 123.456 }
10
+ its(:duration) { should eq 123.456 }
11
11
  its(:popularity) { should eq 0.42 }
12
+ its(:album) { should eq Hallon::Album.new(mock_album) }
13
+ its(:artist) { should eq Hallon::Artist.new(mock_artist) }
14
+ its('artists.size') { should eq 2 }
15
+ its('artists.to_a') { should eq [mock_artist, mock_artist_two].map{ |p| Hallon::Artist.new(p) } }
12
16
 
13
- its("album.name") { should eq "Finally Woken" }
14
- pending("artist.name") { should eq "Jem" }
17
+ describe "#starred=" do
18
+ around { |test| mock_session(&test) }
15
19
 
16
- it { should be_loaded }
20
+ it "should delegate to session to unstar" do
21
+ session.should_receive(:unstar).with(subject)
22
+ subject.starred = false
23
+ end
24
+
25
+
26
+ it "should delegate to session to star" do
27
+ session.should_receive(:star).with(subject)
28
+ subject.starred = true
29
+ end
30
+
31
+ it "should change starred status of track" do
32
+ subject.should be_starred
33
+ subject.starred = false
34
+ subject.should_not be_starred
35
+ end
36
+ end
37
+
38
+ describe "session bound queries" do
39
+ subject { Hallon::Track.new(mock_track) }
40
+ around { |test| mock_session(&test) }
41
+
42
+ it { should be_available }
43
+ it { should_not be_local }
44
+ it { should be_autolinked }
45
+ it { should be_starred }
46
+ end
17
47
 
18
48
  describe "album" do
19
49
  it "should be an album when there is one" do
@@ -46,7 +76,7 @@ describe Hallon::Track, :session => true do
46
76
 
47
77
  describe "offset" do
48
78
  let(:without_offset) { 'spotify:track:7N2Vc8u56VGA4KUrGbikC2' }
49
- let(:with_offset) { without_offset + '#1:00' }
79
+ let(:with_offset) { without_offset + '#1:00' }
50
80
 
51
81
  specify "with offset" do
52
82
  Hallon::Track.new(with_offset).offset.should eq 60
@@ -64,7 +94,12 @@ describe Hallon::Track, :session => true do
64
94
 
65
95
  its(:name) { should eq "Nissy" }
66
96
  its("album.name") { should eq "Coolio" }
67
- pending("artist.name") { should eq "Emmy" }
97
+ its("artist.name") { should eq "Emmy" }
68
98
  its(:duration) { should eq 0.1 }
99
+
100
+ it do
101
+ Hallon::Session.should_receive(:instance).and_return(session)
102
+ should be_local
103
+ end
69
104
  end
70
105
  end
@@ -0,0 +1,47 @@
1
+ require 'ffi'
2
+ require 'rbconfig'
3
+
4
+ module Spotify
5
+ module Mock
6
+ # @return [String] path to the libmockspotify C extension binary.
7
+ def self.path
8
+ File.expand_path('../mockspotify/libmockspotify.', __FILE__) << Config::MAKEFILE_CONFIG['DLEXT']
9
+ end
10
+
11
+ # Overridden to always ffi_lib the mock path.
12
+ def ffi_lib(*)
13
+ super(Mock.path)
14
+ end
15
+
16
+ # Overriden to not throw an error on missing functions.
17
+ def attach_function(*)
18
+ super
19
+ rescue FFI::NotFoundError => e
20
+ warn "#{e.message}" if $VERBOSE
21
+ end
22
+ end
23
+
24
+ extend FFI::Library
25
+ extend Mock
26
+ require 'spotify'
27
+
28
+ old_verbose, $VERBOSE = $VERBOSE, true
29
+
30
+ attach_function :registry_find, [:string], :pointer
31
+ attach_function :registry_add, [:string, :pointer], :void
32
+
33
+ attach_function :mock_session, :mocksp_session_create, [:pointer, :connectionstate, :int, :array, :int, Spotify::OfflineSyncStatus, :int, :int], :session
34
+ attach_function :mock_user, :mocksp_user_create, [:string, :string, :string, :string, :relation_type, :bool], :user
35
+ attach_function :mock_track, :mocksp_track_create, [:string, :int, :array, :album, :int, :int, :int, :int, :error, :bool, :bool, :bool, :bool, :bool], :track
36
+ attach_function :mock_image, :mocksp_image_create, [:image_id, :imageformat, :size_t, :buffer_in, :error], :image
37
+ attach_function :mock_artist, :mocksp_artist_create, [:string, :bool], :artist
38
+ attach_function :mock_album, :mocksp_album_create, [:string, :artist, :int, :image_id, :albumtype, :bool, :bool], :album
39
+
40
+ attach_function :mock_albumbrowse, :mocksp_albumbrowse_create, [:error, :album, :artist, :int, :array, :int, :array, :string, :albumbrowse_complete_cb, :pointer], :albumbrowse
41
+ attach_function :mock_artistbrowse, :mocksp_artistbrowse_create, [:error, :artist, :int, :array, :int, :array, :int, :array, :int, :array, :string, :artistbrowse_complete_cb, :pointer], :artistbrowse
42
+ attach_function :mock_toplistbrowse, :mocksp_toplistbrowse_create, [:error, :int, :array, :int, :array, :int, :array], :toplistbrowse
43
+
44
+ attach_function :mock_search, :mocksp_search_create, [:error, :string, :string, :int, :int, :array, :int, :int, :array, :int, :int, :array, :search_complete_cb, :pointer], :search
45
+
46
+ $VERBOSE = old_verbose
47
+ end
@@ -0,0 +1,5 @@
1
+ [^.]*
2
+ !.gitignore
3
+ !extconf.rb
4
+ !libmockspotify
5
+ !mockspotify_spec.rb
@@ -0,0 +1,5 @@
1
+ require 'mkmf'
2
+
3
+ $CFLAGS << ' -O0 -ggdb -Wextra '
4
+
5
+ create_makefile 'libmockspotify', 'libmockspotify/src'
@@ -0,0 +1,41 @@
1
+ describe Spotify::Mock do
2
+ it "should have injected itself into Spotify's ancestor chain" do
3
+ ancestors = (class << Spotify; self; end).ancestors
4
+ mock_index = ancestors.index(Spotify::Mock)
5
+ ffi_index = ancestors.index(FFI::Library)
6
+
7
+ mock_index.should < ffi_index # [Mock, FFI, BasicObject]
8
+ end
9
+
10
+ describe "hextoa" do
11
+ it "should convert a hexidecimal string properly" do
12
+ Spotify.attach_function :hextoa, [:string, :int], :string
13
+ Spotify.hextoa("3A3A", 4).should eq "::"
14
+ end
15
+ end
16
+
17
+ describe "atohex" do
18
+ it "should convert a byte string to a hexadecimal string" do
19
+ Spotify.attach_function :atohex, [:buffer_out, :buffer_in, :int], :void
20
+
21
+ FFI::Buffer.alloc_out(8) do |b|
22
+ Spotify.atohex(b, "\x3A\x3A\x0F\xF1", b.size)
23
+ b.get_string(0, b.size).should eq "3a3a0ff1"
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "the registry" do
29
+ it "should find previously added entries" do
30
+ Spotify.registry_add("i_exist", FFI::Pointer.new(1))
31
+ Spotify.registry_add("i_exist_too", FFI::Pointer.new(2))
32
+
33
+ Spotify.registry_find("i_exist").should eq FFI::Pointer.new(1)
34
+ Spotify.registry_find("i_exist_too").should eq FFI::Pointer.new(2)
35
+ end
36
+
37
+ it "should return nil for entries not in the registry" do
38
+ Spotify.registry_find("i_do_not_exist").should be_null
39
+ end
40
+ end
41
+ end
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+ require 'bundler/setup'
2
3
 
3
4
  begin
4
5
  require 'cover_me'
@@ -23,6 +24,25 @@ RSpec.configure do |config|
23
24
  appkey = valid_appkey ? 'appkey_good' : 'appkey_bad'
24
25
  Hallon::Session.send(:new, appkey, options)
25
26
  end
27
+
28
+ def instantiate(klass, *pointers)
29
+ pointers.map { |x| klass.new(x) }
30
+ end
31
+
32
+ def mock_session
33
+ Hallon::Session.should_receive(:instance).at_least(1).times.and_return(session)
34
+ yield
35
+ end
36
+
37
+ def pointer_array_with(*args)
38
+ ary = FFI::MemoryPointer.new(:pointer, args.size)
39
+ ary.write_array_of_pointer args
40
+ def ary.length
41
+ size / type_size
42
+ end
43
+
44
+ ary
45
+ end
26
46
  end
27
47
 
28
48
  RSpec::Core::ExampleGroup.instance_eval do
@@ -1,18 +1,95 @@
1
+ # coding: utf-8
1
2
  RSpec::Core::ExampleGroup.instance_eval do
2
3
  let(:mock_artist) { Spotify.mock_artist("Jem", true) }
4
+ let(:mock_artist_two) { Spotify.mock_artist("Maroon 5", true) }
5
+
3
6
  let(:mock_album) { Spotify.mock_album("Finally Woken", mock_artist, 2004, "DEADBEEFDEADBEEFDEAD", :single, true, true) }
4
7
  let(:mock_user) { Spotify.mock_user("burgestrand", "Burgestrand", "Kim Burgestrand", "https://secure.gravatar.com/avatar/b67b73b5b1fd84119ec788b1c3df02ad", :none, true) }
5
8
  let(:mock_image) { Spotify.mock_image(mock_image_id, :jpeg, File.size(fixture_image_path), File.read(fixture_image_path), :ok) }
9
+
6
10
  let(:mock_track) do
7
- track = nil
8
- FFI::MemoryPointer.new(:pointer) do |ary|
9
- ary.write_pointer mock_artist
10
- track = Spotify.mock_track("They", 1, ary, mock_album, 123_456, 42, 2, 7, 0, true)
11
- end
12
- track
11
+ artists = pointer_array_with(mock_artist, mock_artist_two)
12
+ Spotify.mock_track("They", artists.length, artists, mock_album, 123_456, 42, 2, 7, 0, true, true, false, true, true)
13
+ end
14
+
15
+ let(:mock_track_two) do
16
+ artists = pointer_array_with(mock_artist)
17
+ Spotify.mock_track("Amazing", artists.length, artists, mock_album, 123_456, 42, 2, 7, 0, true, true, false, true, true)
18
+ end
19
+
20
+ let(:mock_albumbrowse) do
21
+ copyrights = %w[Kim Elin].map { |x| FFI::MemoryPointer.from_string(x) }
22
+ copyrights = pointer_array_with(*copyrights)
23
+ tracks = pointer_array_with(mock_track, mock_track_two)
24
+ review = "This album is AWESOME"
25
+ Spotify.mock_albumbrowse(:ok, mock_album, mock_artist, 2, copyrights, 2, tracks, review, nil, nil)
26
+ end
27
+
28
+ let(:mock_artistbrowse) do
29
+ artistbrowse = nil
30
+
31
+ mock_image_pointer = FFI::MemoryPointer.from_string(mock_image_id)
32
+ similar_artists = pointer_array_with(mock_artist, mock_artist_two)
33
+ portraits = pointer_array_with(mock_image_pointer, mock_image_pointer)
34
+ tracks = pointer_array_with(mock_track, mock_track_two)
35
+ albums = pointer_array_with(mock_album)
36
+
37
+ Spotify.mock_artistbrowse(:ok, mock_artist, portraits.length, portraits, tracks.length, tracks, albums.length, albums, similar_artists.length, similar_artists, "grew up in DA BLOCK", nil, nil)
38
+ end
39
+
40
+ let(:mock_toplistbrowse) do
41
+ artists = pointer_array_with(mock_artist, mock_artist_two)
42
+ albums = pointer_array_with(mock_album)
43
+ tracks = pointer_array_with(mock_track, mock_track_two)
44
+ Spotify.mock_toplistbrowse(:ok, artists.length, artists, albums.length, albums, tracks.length, tracks)
45
+ end
46
+
47
+ let(:mock_search) do
48
+ artists = pointer_array_with(mock_artist, mock_artist_two)
49
+ albums = pointer_array_with(mock_album)
50
+ tracks = pointer_array_with(mock_track, mock_track_two)
51
+
52
+ Spotify.mock_search(:ok, "my query", "another thing", 1337, tracks.length, tracks, 42, albums.length, albums, 81104, artists.length, artists, nil, nil)
13
53
  end
14
54
 
15
55
  let(:mock_image_hex) { "3ad93423add99766e02d563605c6e76ed2b0e450" }
16
- let(:mock_image_id) { ":\xD94#\xAD\xD9\x97f\xE0-V6\x05\xC6\xE7n\xD2\xB0\xE4P" }
56
+ let(:mock_image_id) { ":\xD94#\xAD\xD9\x97f\xE0-V6\x05\xC6\xE7n\xD2\xB0\xE4P".force_encoding("BINARY") }
17
57
  let(:null_pointer) { FFI::Pointer.new(0) }
58
+
59
+ let(:mock_offline_sync_status) do
60
+ sync = Spotify::OfflineSyncStatus.new
61
+ mock_offline_sync_status_hash.each_pair do |key, value|
62
+ sync[key] = value
63
+ end
64
+ sync
65
+ end
66
+
67
+ let(:mock_offline_sync_status_hash) do
68
+ {
69
+ :queued_tracks => 1,
70
+ :queued_bytes => 2,
71
+ :done_tracks => 3,
72
+ :done_bytes => 4,
73
+ :copied_tracks => 5,
74
+ :copied_bytes => 6,
75
+ :error_tracks => 8,
76
+ :syncing => false,
77
+ :willnotcopy_tracks => 7
78
+ }
79
+ end
80
+
81
+ let(:mock_session_object) do
82
+ session = Hallon::Session.send(:allocate)
83
+ friends = pointer_array_with(mock_user)
84
+ sstatus = mock_offline_sync_status
85
+ session.instance_eval do
86
+ @pointer = Spotify.mock_session(nil, :undefined, friends.length, friends, 60 * 60 * 24 * 30, sstatus, 7, 3)
87
+ end
88
+ session
89
+ end
90
+ end
91
+
92
+ RSpec::Core::ExampleGroup.new.instance_eval do
93
+ Spotify.registry_add 'spotify:track:7N2Vc8u56VGA4KUrGbikC2', mock_track
94
+ Spotify.registry_add 'spotify:user:burgestrand', mock_user
18
95
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hallon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,33 +9,33 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-27 00:00:00.000000000Z
12
+ date: 2011-10-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: spotify
16
- requirement: &2156138200 !ruby/object:Gem::Requirement
16
+ requirement: &2156044680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 8.0.5
21
+ version: 9.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156138200
24
+ version_requirements: *2156044680
25
25
  - !ruby/object:Gem::Dependency
26
- name: mockspotify
27
- requirement: &2156137500 !ruby/object:Gem::Requirement
26
+ name: bundler
27
+ requirement: &2156043420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 0.1.8
32
+ version: '1.0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2156137500
35
+ version_requirements: *2156043420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &2156136740 !ruby/object:Gem::Requirement
38
+ requirement: &2156041620 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0.8'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2156136740
46
+ version_requirements: *2156041620
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &2156136060 !ruby/object:Gem::Requirement
49
+ requirement: &2156039900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '2'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2156136060
57
+ version_requirements: *2156039900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &2156135380 !ruby/object:Gem::Requirement
60
+ requirement: &2156038000 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2156135380
68
+ version_requirements: *2156038000
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rdiscount
71
- requirement: &2156134600 !ruby/object:Gem::Requirement
71
+ requirement: &2156036440 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2156134600
79
+ version_requirements: *2156036440
80
80
  description:
81
81
  email: kim@burgestrand.se
82
82
  executables: []
@@ -86,7 +86,9 @@ files:
86
86
  - .autotest
87
87
  - .gemtest
88
88
  - .gitignore
89
+ - .gitmodules
89
90
  - .rspec
91
+ - .travis.yml
90
92
  - .yardopts
91
93
  - CHANGELOG
92
94
  - Gemfile
@@ -97,26 +99,37 @@ files:
97
99
  - Termfile
98
100
  - examples/logging_in.rb
99
101
  - examples/printing_link_information.rb
102
+ - examples/show_published_playlists_of_user.rb
100
103
  - hallon.gemspec
101
104
  - lib/hallon.rb
102
105
  - lib/hallon/album.rb
106
+ - lib/hallon/album_browse.rb
107
+ - lib/hallon/artist.rb
108
+ - lib/hallon/artist_browse.rb
103
109
  - lib/hallon/base.rb
110
+ - lib/hallon/enumerator.rb
104
111
  - lib/hallon/error.rb
105
112
  - lib/hallon/ext/ffi.rb
106
- - lib/hallon/ext/object.rb
107
113
  - lib/hallon/ext/spotify.rb
108
114
  - lib/hallon/image.rb
109
115
  - lib/hallon/link.rb
110
116
  - lib/hallon/linkable.rb
111
117
  - lib/hallon/observable.rb
118
+ - lib/hallon/player.rb
119
+ - lib/hallon/search.rb
112
120
  - lib/hallon/session.rb
113
121
  - lib/hallon/synchronizable.rb
122
+ - lib/hallon/toplist.rb
114
123
  - lib/hallon/track.rb
115
124
  - lib/hallon/user.rb
116
125
  - lib/hallon/version.rb
117
126
  - spec/fixtures/example_uris.rb
118
127
  - spec/fixtures/pink_cover.jpg
128
+ - spec/hallon/album_browse_spec.rb
119
129
  - spec/hallon/album_spec.rb
130
+ - spec/hallon/artist_browse_spec.rb
131
+ - spec/hallon/artist_spec.rb
132
+ - spec/hallon/enumerator_spec.rb
120
133
  - spec/hallon/error_spec.rb
121
134
  - spec/hallon/ffi_spec.rb
122
135
  - spec/hallon/hallon_spec.rb
@@ -124,19 +137,47 @@ files:
124
137
  - spec/hallon/link_spec.rb
125
138
  - spec/hallon/linkable_spec.rb
126
139
  - spec/hallon/observable_spec.rb
140
+ - spec/hallon/player_spec.rb
141
+ - spec/hallon/search_spec.rb
127
142
  - spec/hallon/session_spec.rb
128
143
  - spec/hallon/synchronizable_spec.rb
144
+ - spec/hallon/toplist_spec.rb
129
145
  - spec/hallon/track_spec.rb
130
146
  - spec/hallon/user_spec.rb
147
+ - spec/mockspotify.rb
148
+ - spec/mockspotify/.gitignore
149
+ - spec/mockspotify/extconf.rb
150
+ - spec/mockspotify/mockspotify_spec.rb
131
151
  - spec/spec_helper.rb
132
152
  - spec/support/.gitkeep
133
153
  - spec/support/common_objects.rb
134
154
  - spec/support/context_logged_in.rb
135
155
  - spec/support/cover_me.rb
136
156
  - spec/support/shared_for_loadable_objects.rb
157
+ - spec/mockspotify/libmockspotify/src/Makefile.am
158
+ - spec/mockspotify/libmockspotify/src/album.c
159
+ - spec/mockspotify/libmockspotify/src/albumbrowse.c
160
+ - spec/mockspotify/libmockspotify/src/artist.c
161
+ - spec/mockspotify/libmockspotify/src/artistbrowse.c
162
+ - spec/mockspotify/libmockspotify/src/error.c
163
+ - spec/mockspotify/libmockspotify/src/image.c
164
+ - spec/mockspotify/libmockspotify/src/libmockspotify.c
165
+ - spec/mockspotify/libmockspotify/src/libmockspotify.h
166
+ - spec/mockspotify/libmockspotify/src/libspotify/api.h
167
+ - spec/mockspotify/libmockspotify/src/link.c
168
+ - spec/mockspotify/libmockspotify/src/player.c
169
+ - spec/mockspotify/libmockspotify/src/playlist.c
170
+ - spec/mockspotify/libmockspotify/src/playlistcontainer.c
171
+ - spec/mockspotify/libmockspotify/src/search.c
172
+ - spec/mockspotify/libmockspotify/src/session.c
173
+ - spec/mockspotify/libmockspotify/src/toplistbrowse.c
174
+ - spec/mockspotify/libmockspotify/src/track.c
175
+ - spec/mockspotify/libmockspotify/src/user.c
176
+ - spec/mockspotify/libmockspotify/src/util.c
177
+ - spec/mockspotify/libmockspotify/src/util.h
137
178
  homepage: http://github.com/Burgestrand/Hallon
138
179
  licenses:
139
- - GNU AGPL
180
+ - X11 License
140
181
  post_install_message:
141
182
  rdoc_options: []
142
183
  require_paths:
@@ -155,14 +196,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
196
  version: '0'
156
197
  requirements: []
157
198
  rubyforge_project:
158
- rubygems_version: 1.8.5
199
+ rubygems_version: 1.8.6
159
200
  signing_key:
160
201
  specification_version: 3
161
202
  summary: Delicious Ruby bindings to the official Spotify API
162
203
  test_files:
163
204
  - spec/fixtures/example_uris.rb
164
205
  - spec/fixtures/pink_cover.jpg
206
+ - spec/hallon/album_browse_spec.rb
165
207
  - spec/hallon/album_spec.rb
208
+ - spec/hallon/artist_browse_spec.rb
209
+ - spec/hallon/artist_spec.rb
210
+ - spec/hallon/enumerator_spec.rb
166
211
  - spec/hallon/error_spec.rb
167
212
  - spec/hallon/ffi_spec.rb
168
213
  - spec/hallon/hallon_spec.rb
@@ -170,10 +215,17 @@ test_files:
170
215
  - spec/hallon/link_spec.rb
171
216
  - spec/hallon/linkable_spec.rb
172
217
  - spec/hallon/observable_spec.rb
218
+ - spec/hallon/player_spec.rb
219
+ - spec/hallon/search_spec.rb
173
220
  - spec/hallon/session_spec.rb
174
221
  - spec/hallon/synchronizable_spec.rb
222
+ - spec/hallon/toplist_spec.rb
175
223
  - spec/hallon/track_spec.rb
176
224
  - spec/hallon/user_spec.rb
225
+ - spec/mockspotify.rb
226
+ - spec/mockspotify/.gitignore
227
+ - spec/mockspotify/extconf.rb
228
+ - spec/mockspotify/mockspotify_spec.rb
177
229
  - spec/spec_helper.rb
178
230
  - spec/support/.gitkeep
179
231
  - spec/support/common_objects.rb