hallon 0.11.0 → 0.12.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 (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: