hallon 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.yardopts +1 -0
  2. data/{CHANGELOG → CHANGELOG.md} +82 -27
  3. data/Gemfile +1 -0
  4. data/README.markdown +1 -1
  5. data/Rakefile +8 -6
  6. data/examples/adding_tracks_to_playlist.rb +3 -0
  7. data/examples/logging_in.rb +3 -0
  8. data/examples/playing_audio.rb +130 -0
  9. data/examples/printing_link_information.rb +3 -0
  10. data/examples/show_published_playlists_of_user.rb +5 -13
  11. data/hallon.gemspec +2 -2
  12. data/lib/hallon.rb +15 -0
  13. data/lib/hallon/album.rb +1 -1
  14. data/lib/hallon/album_browse.rb +4 -3
  15. data/lib/hallon/artist.rb +1 -1
  16. data/lib/hallon/artist_browse.rb +5 -4
  17. data/lib/hallon/base.rb +7 -2
  18. data/lib/hallon/error.rb +1 -1
  19. data/lib/hallon/ext/spotify.rb +26 -42
  20. data/lib/hallon/image.rb +7 -8
  21. data/lib/hallon/observable.rb +134 -62
  22. data/lib/hallon/observable/album_browse.rb +30 -0
  23. data/lib/hallon/observable/artist_browse.rb +31 -0
  24. data/lib/hallon/observable/image.rb +31 -0
  25. data/lib/hallon/observable/player.rb +13 -0
  26. data/lib/hallon/observable/playlist.rb +194 -0
  27. data/lib/hallon/observable/playlist_container.rb +74 -0
  28. data/lib/hallon/observable/post.rb +30 -0
  29. data/lib/hallon/observable/search.rb +29 -0
  30. data/lib/hallon/observable/session.rb +236 -0
  31. data/lib/hallon/observable/toplist.rb +30 -0
  32. data/lib/hallon/player.rb +8 -17
  33. data/lib/hallon/playlist.rb +11 -7
  34. data/lib/hallon/playlist_container.rb +11 -4
  35. data/lib/hallon/queue.rb +71 -0
  36. data/lib/hallon/search.rb +10 -7
  37. data/lib/hallon/session.rb +18 -21
  38. data/lib/hallon/toplist.rb +4 -3
  39. data/lib/hallon/user.rb +5 -5
  40. data/lib/hallon/version.rb +1 -1
  41. data/spec/hallon/album_browse_spec.rb +4 -0
  42. data/spec/hallon/artist_browse_spec.rb +4 -0
  43. data/spec/hallon/base_spec.rb +26 -9
  44. data/spec/hallon/hallon_spec.rb +0 -18
  45. data/spec/hallon/image_spec.rb +0 -1
  46. data/spec/hallon/link_spec.rb +14 -0
  47. data/spec/hallon/observable/album_browse_spec.rb +7 -0
  48. data/spec/hallon/observable/artist_browse_spec.rb +7 -0
  49. data/spec/hallon/observable/image_spec.rb +8 -0
  50. data/spec/hallon/observable/playlist_container_spec.rb +21 -0
  51. data/spec/hallon/observable/playlist_spec.rb +85 -0
  52. data/spec/hallon/observable/post_spec.rb +8 -0
  53. data/spec/hallon/observable/search_spec.rb +7 -0
  54. data/spec/hallon/observable/session_spec.rb +143 -0
  55. data/spec/hallon/observable/toplist_spec.rb +7 -0
  56. data/spec/hallon/observable_spec.rb +134 -65
  57. data/spec/hallon/playlist_container_spec.rb +24 -18
  58. data/spec/hallon/playlist_spec.rb +2 -0
  59. data/spec/hallon/queue_spec.rb +35 -0
  60. data/spec/hallon/session_spec.rb +4 -4
  61. data/spec/hallon/spotify_spec.rb +35 -9
  62. data/spec/mockspotify.rb +2 -3
  63. data/spec/spec_helper.rb +0 -1
  64. data/spec/support/common_objects.rb +27 -15
  65. data/spec/support/enumerable_comparison.rb +9 -0
  66. data/spec/support/shared_for_callbacks.rb +60 -0
  67. data/spec/support/shared_for_linkable_objects.rb +1 -1
  68. metadata +56 -20
@@ -6,7 +6,7 @@ describe Hallon::PlaylistContainer do
6
6
 
7
7
  it { should be_loaded }
8
8
  its(:owner) { should eq Hallon::User.new("burgestrand") }
9
- its(:size) { should eq 3 }
9
+ its(:size) { should eq 4 }
10
10
 
11
11
  describe "#add" do
12
12
  context "given a string that’s not a valid spotify playlist uri" do
@@ -100,15 +100,15 @@ describe Hallon::PlaylistContainer do
100
100
  end
101
101
 
102
102
  it "should remove the matching :end_folder if removing a :start_folder" do
103
- container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::PlaylistContainer::Folder]
103
+ container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::Playlist, Hallon::PlaylistContainer::Folder]
104
104
  expect { container.remove(1) }.to change { container.size }.by(-2)
105
- container.contents.map(&:class).should eq [Hallon::Playlist]
105
+ container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::Playlist]
106
106
  end
107
107
 
108
108
  it "should remove the matching :start_folder if removing a :end_folder" do
109
- container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::PlaylistContainer::Folder]
110
- expect { container.remove(2) }.to change { container.size }.by(-2)
111
- container.contents.map(&:class).should eq [Hallon::Playlist]
109
+ container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::Playlist, Hallon::PlaylistContainer::Folder]
110
+ expect { container.remove(3) }.to change { container.size }.by(-2)
111
+ container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::Playlist]
112
112
  end
113
113
 
114
114
  it "should raise an error if the index is out of range" do
@@ -118,13 +118,17 @@ describe Hallon::PlaylistContainer do
118
118
 
119
119
  describe "#move" do
120
120
  it "should move the playlist from the old index to the new index" do
121
- playlist = container.contents[0]
121
+ playlist = container.contents[0]
122
+ playlist_two = container.contents[2]
123
+
124
+ container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::Playlist, Hallon::PlaylistContainer::Folder]
122
125
 
123
- container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::PlaylistContainer::Folder]
124
126
  container.move(0, 1).should eq playlist
125
- container.contents.map(&:class).should eq [Hallon::PlaylistContainer::Folder, Hallon::Playlist, Hallon::PlaylistContainer::Folder]
126
- container.move(1, 0).should eq playlist
127
- container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::PlaylistContainer::Folder]
127
+ container.contents.map(&:class).should eq [Hallon::PlaylistContainer::Folder, Hallon::Playlist, Hallon::Playlist, Hallon::PlaylistContainer::Folder]
128
+ container.contents[1].should eq playlist
129
+
130
+ container.move(2, 0).should eq playlist_two
131
+ container.contents.map(&:class).should eq [Hallon::Playlist, Hallon::PlaylistContainer::Folder, Hallon::Playlist, Hallon::PlaylistContainer::Folder]
128
132
  end
129
133
 
130
134
  it "should raise an error if the operation failed" do
@@ -148,13 +152,13 @@ describe Hallon::PlaylistContainer do
148
152
  end
149
153
 
150
154
  it "should support retrieving folders from their start" do
151
- folder = Hallon::PlaylistContainer::Folder.new(container, 1..2)
155
+ folder = Hallon::PlaylistContainer::Folder.new(container, 1..3)
152
156
  container.contents[1].should eq folder
153
157
  end
154
158
 
155
159
  it "should support retrieving folders from their end" do
156
- folder = Hallon::PlaylistContainer::Folder.new(container, 1..2)
157
- container.contents[2].should eq folder
160
+ folder = Hallon::PlaylistContainer::Folder.new(container, 1..3)
161
+ container.contents[3].should eq folder
158
162
  end
159
163
  end
160
164
 
@@ -165,7 +169,7 @@ describe Hallon::PlaylistContainer do
165
169
  its(:id) { should be 1337 }
166
170
  its(:name) { should eq "Boogie" }
167
171
  its(:begin) { should be 1 }
168
- its(:end) { should be 2 }
172
+ its(:end) { should be 3 }
169
173
 
170
174
  describe "#moved?" do
171
175
  it "should return true if the folder has moved" do
@@ -178,7 +182,9 @@ describe Hallon::PlaylistContainer do
178
182
  end
179
183
 
180
184
  describe "#contents" do
181
- it "should be a collection of folders and playlists"
185
+ it "should be a collection of folders and playlists" do
186
+ folder.contents.should eq container.contents[2, 1]
187
+ end
182
188
  end
183
189
 
184
190
  describe "#rename" do
@@ -190,7 +196,7 @@ describe Hallon::PlaylistContainer do
190
196
  folder.id.should eq 1337
191
197
  folder.name.should eq "Boogie"
192
198
  folder.begin.should be 1
193
- folder.end.should be 2
199
+ folder.end.should be 3
194
200
 
195
201
  container.contents.should_not include(folder)
196
202
  end
@@ -201,7 +207,7 @@ describe Hallon::PlaylistContainer do
201
207
  new_folder.id.should_not eq 1337
202
208
  new_folder.name.should eq "Hiphip"
203
209
  new_folder.begin.should be 1
204
- new_folder.end.should be 2
210
+ new_folder.end.should be 3
205
211
  end
206
212
 
207
213
  it "should raise an error if the folder has moved" do
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require 'time'
2
3
 
3
4
  describe Hallon::Playlist do
@@ -148,6 +149,7 @@ describe Hallon::Playlist do
148
149
 
149
150
  it "should fail given a too long name" do
150
151
  expect { playlist.name = "a" * 256 }.to raise_error(ArgumentError)
152
+ expect { playlist.name = "ä" * 200 }.to raise_error(ArgumentError)
151
153
  end
152
154
  end
153
155
 
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ describe Hallon::Queue do
3
+ let(:queue) { Hallon::Queue.new(4) }
4
+ subject { queue }
5
+
6
+ it "should conform to the example specification of its’ documentation" do
7
+ queue.push([1, 2]).should eq 2
8
+ queue.push([3]).should eq 1
9
+ queue.push([4, 5, 6]).should eq 1
10
+ queue.push([5, 6]).should eq 0
11
+ queue.pop(1).should eq [1]
12
+ queue.push([5, 6]).should eq 1
13
+ queue.pop.should eq [2, 3, 4, 5]
14
+ end
15
+
16
+ describe "#pop" do
17
+ it "should not block if the queue is not empty" do
18
+ queue.push([1, 2])
19
+
20
+ start = Time.now
21
+ queue.pop.should eq [1, 2]
22
+ (Time.now - start).should be_within(0.001).of(0)
23
+ end
24
+
25
+ it "should block if the queue is empty" do
26
+ queue.size.should be_zero
27
+
28
+ # I could mock out ConditionVariable and Mutex, but where’s the fun in that?
29
+ start = Time.now
30
+ Thread.start { sleep 0.2; queue.push([1]) }
31
+ queue.pop.should eq [1]
32
+ (Time.now - start).should be_within(0.08).of(0.2)
33
+ end
34
+ end
35
+ end
@@ -74,21 +74,21 @@ describe Hallon::Session do
74
74
 
75
75
  session.should_receive(:process_events).twice.and_return do
76
76
  unless notified
77
- session.trigger(:notify_main_thread, :notify)
77
+ session.class.send(:notify_main_thread_callback, session.pointer)
78
78
  notified = true
79
79
  else
80
- session.trigger(:bogus, :bogus)
80
+ session.class.send(:logged_in_callback, session.pointer, :ok)
81
81
  end
82
82
 
83
83
  0
84
84
  end
85
85
 
86
- session.process_events_on(:bogus) { |e| e == :bogus }.should be_true
86
+ session.process_events_on(:logged_in) { |e| e == :ok }.should be_true
87
87
  end
88
88
 
89
89
  it "should time out if waiting for events too long" do
90
90
  session.should_receive(:process_events).once.and_return(1) # and do nothing
91
- session.wait_for(:ever) { |x| x }.should eq :timeout
91
+ session.wait_for(:logged_in) { |x| x }.should eq :timeout
92
92
  end
93
93
 
94
94
  it "should call the given block once before waiting" do
@@ -16,15 +16,41 @@ describe Spotify do
16
16
  end
17
17
  end
18
18
 
19
- describe "garbage collection" do
20
- let(:my_pointer) { FFI::Pointer.new(1) }
21
-
22
- it "should work" do
23
- # GC tests are a bit funky, but as long as we garbage_release at least once, then
24
- # we can assume our GC works properly, but up the stakes just for the sake of it
25
- Spotify.should_receive(:garbage_release).with(my_pointer).at_least(3).times
26
- 5.times { Spotify::Pointer.new(my_pointer, :garbage, false) }
27
- 5.times { GC.start; sleep 0.1 }
19
+ describe Spotify::Pointer do
20
+ describe ".typechecks?" do
21
+ it "should return false for non-spotify pointers" do
22
+ Spotify::Pointer.typechecks?(double(type: :artist), :artist).should be_false
23
+ end
24
+
25
+ it "should be false for pointers of another type if type is given" do
26
+ Spotify::Pointer.typechecks?(mock_album, :artist).should be_false
27
+ end
28
+
29
+ it "should be true for a pointer of the correct type" do
30
+ Spotify::Pointer.typechecks?(mock_album, :album).should be_true
31
+ end
32
+ end
33
+
34
+ describe "garbage collection" do
35
+ let(:my_pointer) { FFI::Pointer.new(1) }
36
+
37
+ it "should work" do
38
+ # GC tests are a bit funky, but as long as we garbage_release at least once, then
39
+ # we can assume our GC works properly, but up the stakes just for the sake of it
40
+ Spotify.should_receive(:garbage_release).with(my_pointer).at_least(3).times
41
+ 5.times { Spotify::Pointer.new(my_pointer, :garbage, false) }
42
+ 5.times { GC.start; sleep 0.01 }
43
+ end
44
+ end
45
+ end
46
+
47
+ describe Spotify::CallbackStruct do
48
+ subject { Spotify::SessionCallbacks.new }
49
+ it { should be_a Spotify::CallbackStruct }
50
+
51
+ it "should raise an error if given a callback of the wrong arity" do
52
+ callback = lambda { |x| }
53
+ expect { subject[:logged_in] = callback }.to raise_error(ArgumentError, /takes 2 arguments/)
28
54
  end
29
55
  end
30
56
  end
@@ -50,9 +50,8 @@ module Spotify
50
50
 
51
51
  def self.attach_mock_function(name, cname, params, returns, options = {})
52
52
  attach_function(name, cname, params, returns, options)
53
- old_method = method(name)
54
- define_singleton_method(name) do |*args|
55
- Spotify::Pointer.new(old_method[*args], returns, false)
53
+ define_singleton_method("#{name}!") do |*args|
54
+ Spotify::Pointer.new(send(name, *args), returns, false)
56
55
  end
57
56
  end
58
57
 
@@ -1,5 +1,4 @@
1
1
  # coding: utf-8
2
- require 'bundler/setup'
3
2
 
4
3
  begin
5
4
  require 'cover_me'
@@ -2,21 +2,23 @@
2
2
  require 'time'
3
3
 
4
4
  RSpec::Core::ExampleGroup.instance_eval do
5
- let(:mock_artist) { Spotify.mock_artist("Jem", mock_image_id, true) }
6
- let(:mock_artist_two) { Spotify.mock_artist("Maroon 5", mock_image_id, true) }
5
+ let(:mock_artist) { Spotify.mock_artist!("Jem", mock_image_id, true) }
6
+ let(:mock_artist_two) { Spotify.mock_artist!("Maroon 5", mock_image_id, true) }
7
7
 
8
- let(:mock_album) { Spotify.mock_album("Finally Woken", mock_artist, 2004, mock_image_id, :single, true, true) }
9
- let(:mock_user) { Spotify.mock_user("burgestrand", "Burgestrand", true) }
10
- let(:mock_image) { Spotify.mock_image(mock_image_id, :jpeg, File.size(fixture_image_path), File.read(fixture_image_path), :ok) }
8
+ let(:mock_album) { Spotify.mock_album!("Finally Woken", mock_artist, 2004, mock_image_id, :single, true, true) }
9
+ let(:mock_user) { Spotify.mock_user!("burgestrand", "Burgestrand", true) }
10
+ let(:mock_user_raw) { FFI::Pointer.new(mock_user.address) }
11
+ let(:mock_image) { Spotify.mock_image!(mock_image_id, :jpeg, File.size(fixture_image_path), File.read(fixture_image_path), :ok) }
12
+ let(:mock_image_id_pointer) { FFI::MemoryPointer.from_string(mock_image_id) }
11
13
 
12
14
  let(:mock_track) do
13
15
  artists = pointer_array_with(mock_artist, mock_artist_two)
14
- Spotify.mock_track("They", artists.length, artists, mock_album, 123_456, 42, 2, 7, 0, true, :available, :done, false, true, true, false)
16
+ Spotify.mock_track!("They", artists.length, artists, mock_album, 123_456, 42, 2, 7, 0, true, :available, :done, false, true, true, false)
15
17
  end
16
18
 
17
19
  let(:mock_track_two) do
18
20
  artists = pointer_array_with(mock_artist)
19
- Spotify.mock_track("Amazing", artists.length, artists, mock_album, 123_456, 42, 2, 7, 0, true, :available, :no, false, true, true, true)
21
+ Spotify.mock_track!("Amazing", artists.length, artists, mock_album, 123_456, 42, 2, 7, 0, true, :available, :no, false, true, true, true)
20
22
  end
21
23
 
22
24
  let(:mock_albumbrowse) do
@@ -28,9 +30,8 @@ RSpec::Core::ExampleGroup.instance_eval do
28
30
  end
29
31
 
30
32
  let(:mock_artistbrowse) do
31
- mock_image_pointer = FFI::MemoryPointer.from_string(mock_image_id)
32
33
  similar_artists = pointer_array_with(mock_artist, mock_artist_two)
33
- portraits = pointer_array_with(mock_image_pointer, mock_image_pointer)
34
+ portraits = pointer_array_with(mock_image_id_pointer, mock_image_id_pointer)
34
35
  tracks = pointer_array_with(mock_track, mock_track_two)
35
36
  albums = pointer_array_with(mock_album)
36
37
 
@@ -97,7 +98,15 @@ RSpec::Core::ExampleGroup.instance_eval do
97
98
  tracks[3][:message] = FFI::MemoryPointer.from_string("message this, YO!")
98
99
  tracks[3][:seen] = true
99
100
 
100
- Spotify.mock_playlist("Megaplaylist", true, mock_user, true, "Playlist description...?", mock_image_id, false, 1000, mock_subscribers, true, :no, 67, num_tracks, tracks_ptr)
101
+ Spotify.mock_playlist!("Megaplaylist", true, mock_user, true, "Playlist description...?", mock_image_id, false, 1000, mock_subscribers, true, :no, 67, num_tracks, tracks_ptr)
102
+ end
103
+
104
+ let(:mock_playlist_two) do
105
+ Spotify.mock_playlist!("Dunderlist", true, mock_user, true, nil, nil, false, 1000, nil, true, :no, 0, 0, nil)
106
+ end
107
+
108
+ let(:mock_playlist_raw) do
109
+ FFI::Pointer.new(mock_playlist.address)
101
110
  end
102
111
 
103
112
  let(:mock_image_uri) { "spotify:image:#{mock_image_hex}" }
@@ -147,7 +156,7 @@ RSpec::Core::ExampleGroup.instance_eval do
147
156
  end
148
157
 
149
158
  let(:mock_container) do
150
- num_items = 3
159
+ num_items = 4
151
160
  items_ptr = FFI::MemoryPointer.new(Spotify::Mock::PlaylistTrack, num_items)
152
161
  items = num_items.times.map do |i|
153
162
  Spotify::Mock::PlaylistContainerItem.new(items_ptr + Spotify::Mock::PlaylistContainerItem.size * i)
@@ -160,11 +169,14 @@ RSpec::Core::ExampleGroup.instance_eval do
160
169
  items[1][:type] = :start_folder
161
170
  items[1][:folder_id] = 1337
162
171
 
163
- items[2][:folder_name] = FFI::Pointer::NULL
164
- items[2][:type] = :end_folder
165
- items[2][:folder_id] = 1337
172
+ items[2][:playlist] = mock_playlist_two
173
+ items[2][:type] = :playlist
174
+
175
+ items[3][:folder_name] = FFI::Pointer::NULL
176
+ items[3][:type] = :end_folder
177
+ items[3][:folder_id] = 1337
166
178
 
167
- Spotify.mock_playlistcontainer(mock_user, true, num_items, items_ptr, nil, nil)
179
+ Spotify.mock_playlistcontainer!(mock_user, true, num_items, items_ptr, nil, nil)
168
180
  end
169
181
  end
170
182
 
@@ -0,0 +1,9 @@
1
+ class Enumerator
2
+ def ===(other)
3
+ if other.is_a?(Enumerable)
4
+ to_a == other.to_a
5
+ else
6
+ super
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ # coding: utf-8
2
+ RSpec.configure do
3
+ def specification_for_callback(name, *args, &block)
4
+ describe("##{name}_callback", *args) do
5
+ let(:subject_callback) do
6
+ klass.send(:callback_for, name)
7
+ end
8
+
9
+ let(:pointer) { input[0] }
10
+
11
+ let(:klass) do
12
+ observable_class = described_class
13
+ pointer_address = pointer.address
14
+
15
+ Class.new do
16
+ extend observable_class
17
+
18
+ attr_reader :callbacks
19
+
20
+ def initialize
21
+ subscribe_for_callbacks do |callbacks|
22
+ @callbacks = callbacks
23
+ end
24
+ end
25
+
26
+ define_method(:pointer) do
27
+ FFI::Pointer.new(pointer_address)
28
+ end
29
+ end
30
+ end
31
+
32
+ subject { klass.new }
33
+
34
+ instance_eval(&block)
35
+
36
+ it "should trigger #{name} with the proper arguments" do
37
+ block = proc {}
38
+
39
+ subject.on(name, &block)
40
+ block.should_receive(:call) do |*arguments|
41
+ output.each_with_index do |e, i|
42
+ arguments[i].should === e
43
+ end
44
+ nil
45
+ end
46
+
47
+ subject_callback.call(*input)
48
+ end
49
+
50
+ # this is not needed for struct members when creating the
51
+ # callback struct trough .create, as that method will make
52
+ # sure the methods have the correct arity
53
+ # (also, we can’t find the struct callback arity in any nice way)
54
+ it "should have the correct arity" do
55
+ fn = Spotify.find_type(type)
56
+ subject_callback.arity.should eq fn.param_types.size
57
+ end if method_defined?(:type)
58
+ end
59
+ end
60
+ end
@@ -13,7 +13,7 @@ shared_examples_for "a Linkable object" do
13
13
  end
14
14
 
15
15
  it "should fail with an invalid spotify pointer" do
16
- expect { described_class.new("i_am_invalid_uri") }.to raise_error(ArgumentError, /could not be converted to a spotify \w+ pointer/)
16
+ expect { described_class.new("i_am_invalid_uri") }.to raise_error(ArgumentError)
17
17
  end
18
18
 
19
19
  it "should work with a Link object" do
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.11.0
4
+ version: 0.12.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-12-13 00:00:00.000000000 Z
12
+ date: 2011-12-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: spotify
16
- requirement: &70296624265220 !ruby/object:Gem::Requirement
15
+ name: ref
16
+ requirement: &70217238288320 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 10.1.1
21
+ version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70296624265220
24
+ version_requirements: *70217238288320
25
25
  - !ruby/object:Gem::Dependency
26
- name: bundler
27
- requirement: &70296624264760 !ruby/object:Gem::Requirement
26
+ name: spotify
27
+ requirement: &70217238287820 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: '1.0'
33
- type: :development
32
+ version: 10.3.0
33
+ type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70296624264760
35
+ version_requirements: *70217238287820
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &70296624264300 !ruby/object:Gem::Requirement
38
+ requirement: &70217238287340 !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: *70296624264300
46
+ version_requirements: *70217238287340
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70296619129680 !ruby/object:Gem::Requirement
49
+ requirement: &70217238286700 !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: *70296619129680
57
+ version_requirements: *70217238286700
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &70296619126080 !ruby/object:Gem::Requirement
60
+ requirement: &70217238286240 !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: *70296619126080
68
+ version_requirements: *70217238286240
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rdiscount
71
- requirement: &70296619124020 !ruby/object:Gem::Requirement
71
+ requirement: &70217238285560 !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: *70296619124020
79
+ version_requirements: *70217238285560
80
80
  description:
81
81
  email: kim@burgestrand.se
82
82
  executables: []
@@ -89,7 +89,7 @@ files:
89
89
  - .rspec
90
90
  - .travis.yml
91
91
  - .yardopts
92
- - CHANGELOG
92
+ - CHANGELOG.md
93
93
  - Gemfile
94
94
  - LICENSE.txt
95
95
  - QUIRKS
@@ -98,6 +98,7 @@ files:
98
98
  - dev/login.rb
99
99
  - examples/adding_tracks_to_playlist.rb
100
100
  - examples/logging_in.rb
101
+ - examples/playing_audio.rb
101
102
  - examples/printing_link_information.rb
102
103
  - examples/show_published_playlists_of_user.rb
103
104
  - hallon.gemspec
@@ -115,9 +116,20 @@ files:
115
116
  - lib/hallon/link.rb
116
117
  - lib/hallon/linkable.rb
117
118
  - lib/hallon/observable.rb
119
+ - lib/hallon/observable/album_browse.rb
120
+ - lib/hallon/observable/artist_browse.rb
121
+ - lib/hallon/observable/image.rb
122
+ - lib/hallon/observable/player.rb
123
+ - lib/hallon/observable/playlist.rb
124
+ - lib/hallon/observable/playlist_container.rb
125
+ - lib/hallon/observable/post.rb
126
+ - lib/hallon/observable/search.rb
127
+ - lib/hallon/observable/session.rb
128
+ - lib/hallon/observable/toplist.rb
118
129
  - lib/hallon/player.rb
119
130
  - lib/hallon/playlist.rb
120
131
  - lib/hallon/playlist_container.rb
132
+ - lib/hallon/queue.rb
121
133
  - lib/hallon/search.rb
122
134
  - lib/hallon/session.rb
123
135
  - lib/hallon/toplist.rb
@@ -138,10 +150,20 @@ files:
138
150
  - spec/hallon/image_spec.rb
139
151
  - spec/hallon/link_spec.rb
140
152
  - spec/hallon/linkable_spec.rb
153
+ - spec/hallon/observable/album_browse_spec.rb
154
+ - spec/hallon/observable/artist_browse_spec.rb
155
+ - spec/hallon/observable/image_spec.rb
156
+ - spec/hallon/observable/playlist_container_spec.rb
157
+ - spec/hallon/observable/playlist_spec.rb
158
+ - spec/hallon/observable/post_spec.rb
159
+ - spec/hallon/observable/search_spec.rb
160
+ - spec/hallon/observable/session_spec.rb
161
+ - spec/hallon/observable/toplist_spec.rb
141
162
  - spec/hallon/observable_spec.rb
142
163
  - spec/hallon/player_spec.rb
143
164
  - spec/hallon/playlist_container_spec.rb
144
165
  - spec/hallon/playlist_spec.rb
166
+ - spec/hallon/queue_spec.rb
145
167
  - spec/hallon/search_spec.rb
146
168
  - spec/hallon/session_spec.rb
147
169
  - spec/hallon/spotify_spec.rb
@@ -157,6 +179,8 @@ files:
157
179
  - spec/support/common_objects.rb
158
180
  - spec/support/context_logged_in.rb
159
181
  - spec/support/cover_me.rb
182
+ - spec/support/enumerable_comparison.rb
183
+ - spec/support/shared_for_callbacks.rb
160
184
  - spec/support/shared_for_linkable_objects.rb
161
185
  - spec/support/shared_for_loadable_objects.rb
162
186
  - spec/mockspotify/libmockspotify/src/Makefile.am
@@ -222,10 +246,20 @@ test_files:
222
246
  - spec/hallon/image_spec.rb
223
247
  - spec/hallon/link_spec.rb
224
248
  - spec/hallon/linkable_spec.rb
249
+ - spec/hallon/observable/album_browse_spec.rb
250
+ - spec/hallon/observable/artist_browse_spec.rb
251
+ - spec/hallon/observable/image_spec.rb
252
+ - spec/hallon/observable/playlist_container_spec.rb
253
+ - spec/hallon/observable/playlist_spec.rb
254
+ - spec/hallon/observable/post_spec.rb
255
+ - spec/hallon/observable/search_spec.rb
256
+ - spec/hallon/observable/session_spec.rb
257
+ - spec/hallon/observable/toplist_spec.rb
225
258
  - spec/hallon/observable_spec.rb
226
259
  - spec/hallon/player_spec.rb
227
260
  - spec/hallon/playlist_container_spec.rb
228
261
  - spec/hallon/playlist_spec.rb
262
+ - spec/hallon/queue_spec.rb
229
263
  - spec/hallon/search_spec.rb
230
264
  - spec/hallon/session_spec.rb
231
265
  - spec/hallon/spotify_spec.rb
@@ -241,6 +275,8 @@ test_files:
241
275
  - spec/support/common_objects.rb
242
276
  - spec/support/context_logged_in.rb
243
277
  - spec/support/cover_me.rb
278
+ - spec/support/enumerable_comparison.rb
279
+ - spec/support/shared_for_callbacks.rb
244
280
  - spec/support/shared_for_linkable_objects.rb
245
281
  - spec/support/shared_for_loadable_objects.rb
246
282
  has_rdoc: