hallon 0.4.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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