hallon 0.12.0 → 0.13.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 (47) hide show
  1. data/CHANGELOG.md +43 -0
  2. data/Gemfile +3 -1
  3. data/README.markdown +41 -11
  4. data/Rakefile +12 -0
  5. data/examples/audio_driver.rb +55 -0
  6. data/examples/playing_audio.rb +10 -50
  7. data/hallon.gemspec +1 -1
  8. data/lib/hallon.rb +1 -1
  9. data/lib/hallon/album_browse.rb +22 -11
  10. data/lib/hallon/artist_browse.rb +64 -33
  11. data/lib/hallon/audio_driver.rb +138 -0
  12. data/lib/hallon/audio_queue.rb +110 -0
  13. data/lib/hallon/enumerator.rb +55 -16
  14. data/lib/hallon/error.rb +9 -2
  15. data/lib/hallon/image.rb +6 -5
  16. data/lib/hallon/link.rb +7 -4
  17. data/lib/hallon/linkable.rb +27 -0
  18. data/lib/hallon/observable/player.rb +18 -1
  19. data/lib/hallon/observable/session.rb +5 -1
  20. data/lib/hallon/player.rb +180 -54
  21. data/lib/hallon/playlist.rb +33 -20
  22. data/lib/hallon/playlist_container.rb +78 -64
  23. data/lib/hallon/search.rb +51 -33
  24. data/lib/hallon/session.rb +1 -1
  25. data/lib/hallon/toplist.rb +36 -18
  26. data/lib/hallon/track.rb +12 -6
  27. data/lib/hallon/version.rb +1 -1
  28. data/spec/hallon/artist_browse_spec.rb +3 -4
  29. data/spec/hallon/audio_queue_spec.rb +89 -0
  30. data/spec/hallon/enumerator_spec.rb +50 -25
  31. data/spec/hallon/error_spec.rb +2 -2
  32. data/spec/hallon/image_spec.rb +12 -5
  33. data/spec/hallon/link_spec.rb +8 -9
  34. data/spec/hallon/linkable_spec.rb +11 -0
  35. data/spec/hallon/observable/session_spec.rb +4 -0
  36. data/spec/hallon/player_spec.rb +118 -5
  37. data/spec/hallon/playlist_container_spec.rb +2 -2
  38. data/spec/hallon/playlist_spec.rb +32 -37
  39. data/spec/hallon/search_spec.rb +3 -3
  40. data/spec/hallon/user_spec.rb +0 -6
  41. data/spec/spec_helper.rb +10 -0
  42. data/spec/support/audio_driver_mock.rb +23 -0
  43. data/spec/support/context_stub_session.rb +5 -0
  44. data/spec/support/shared_for_linkable_objects.rb +22 -2
  45. metadata +26 -20
  46. data/lib/hallon/queue.rb +0 -71
  47. data/spec/hallon/queue_spec.rb +0 -35
@@ -0,0 +1,23 @@
1
+ class AudioDriverMock
2
+ attr_reader :state
3
+
4
+ # Expected implementation:
5
+ attr_accessor :format
6
+
7
+ def stream(&block)
8
+ @stream = block if block_given?
9
+ @stream
10
+ end
11
+
12
+ def play
13
+ @state = :play
14
+ end
15
+
16
+ def pause
17
+ @state = :pause
18
+ end
19
+
20
+ def stop
21
+ @state = :stop
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ shared_context "stubbed session", :stub_session do
2
+ before do
3
+ subject.stub(:session).and_return(session)
4
+ end
5
+ end
@@ -1,5 +1,7 @@
1
1
  # coding: utf-8
2
2
  shared_examples_for "a Linkable object" do
3
+ subject { described_class.new(spotify_uri) }
4
+
3
5
  describe "instantiation" do
4
6
  let(:spotify_pointer) do
5
7
  ptr_type = Hallon::Link.new(spotify_uri).type
@@ -30,10 +32,28 @@ shared_examples_for "a Linkable object" do
30
32
  end
31
33
 
32
34
  describe "#to_link" do
33
- subject { described_class.new(spotify_uri) }
34
-
35
35
  it "should return a valid link" do
36
36
  subject.to_link.should eq Hallon::Link.new(spotify_uri)
37
37
  end
38
38
  end
39
+
40
+ describe "#to_str" do
41
+ it "should return the spotify URI for this object" do
42
+ subject.to_str.should eq spotify_uri
43
+ end
44
+
45
+ it "should return an empty string if #to_link fails" do
46
+ subject.should_receive(:to_link).and_return(nil)
47
+ subject.to_str.should eq ""
48
+ end
49
+ end
50
+
51
+ describe "#===" do
52
+ it "should compare the objects by their links if both are Linkable" do
53
+ mock = double
54
+ mock.stub(:to_link).and_return(subject.to_link)
55
+
56
+ (subject === mock).should be_true
57
+ end
58
+ end
39
59
  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.12.0
4
+ version: 0.13.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-25 00:00:00.000000000 Z
12
+ date: 2012-02-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ref
16
- requirement: &70217238288320 !ruby/object:Gem::Requirement
16
+ requirement: &70259239927580 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70217238288320
24
+ version_requirements: *70259239927580
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: spotify
27
- requirement: &70217238287820 !ruby/object:Gem::Requirement
27
+ requirement: &70259239926980 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 10.3.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70217238287820
35
+ version_requirements: *70259239926980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &70217238287340 !ruby/object:Gem::Requirement
38
+ requirement: &70259239926460 !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: *70217238287340
46
+ version_requirements: *70259239926460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70217238286700 !ruby/object:Gem::Requirement
49
+ requirement: &70259239926000 !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: *70217238286700
57
+ version_requirements: *70259239926000
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &70217238286240 !ruby/object:Gem::Requirement
60
+ requirement: &70259239925600 !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: *70217238286240
68
+ version_requirements: *70259239925600
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rdiscount
71
- requirement: &70217238285560 !ruby/object:Gem::Requirement
71
+ requirement: &70259239925140 !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: *70217238285560
79
+ version_requirements: *70259239925140
80
80
  description:
81
81
  email: kim@burgestrand.se
82
82
  executables: []
@@ -97,6 +97,7 @@ files:
97
97
  - Rakefile
98
98
  - dev/login.rb
99
99
  - examples/adding_tracks_to_playlist.rb
100
+ - examples/audio_driver.rb
100
101
  - examples/logging_in.rb
101
102
  - examples/playing_audio.rb
102
103
  - examples/printing_link_information.rb
@@ -107,6 +108,8 @@ files:
107
108
  - lib/hallon/album_browse.rb
108
109
  - lib/hallon/artist.rb
109
110
  - lib/hallon/artist_browse.rb
111
+ - lib/hallon/audio_driver.rb
112
+ - lib/hallon/audio_queue.rb
110
113
  - lib/hallon/base.rb
111
114
  - lib/hallon/enumerator.rb
112
115
  - lib/hallon/error.rb
@@ -129,7 +132,6 @@ files:
129
132
  - lib/hallon/player.rb
130
133
  - lib/hallon/playlist.rb
131
134
  - lib/hallon/playlist_container.rb
132
- - lib/hallon/queue.rb
133
135
  - lib/hallon/search.rb
134
136
  - lib/hallon/session.rb
135
137
  - lib/hallon/toplist.rb
@@ -142,6 +144,7 @@ files:
142
144
  - spec/hallon/album_spec.rb
143
145
  - spec/hallon/artist_browse_spec.rb
144
146
  - spec/hallon/artist_spec.rb
147
+ - spec/hallon/audio_queue_spec.rb
145
148
  - spec/hallon/base_spec.rb
146
149
  - spec/hallon/enumerator_spec.rb
147
150
  - spec/hallon/error_spec.rb
@@ -163,7 +166,6 @@ files:
163
166
  - spec/hallon/player_spec.rb
164
167
  - spec/hallon/playlist_container_spec.rb
165
168
  - spec/hallon/playlist_spec.rb
166
- - spec/hallon/queue_spec.rb
167
169
  - spec/hallon/search_spec.rb
168
170
  - spec/hallon/session_spec.rb
169
171
  - spec/hallon/spotify_spec.rb
@@ -176,8 +178,10 @@ files:
176
178
  - spec/mockspotify/mockspotify_spec.rb
177
179
  - spec/spec_helper.rb
178
180
  - spec/support/.gitkeep
181
+ - spec/support/audio_driver_mock.rb
179
182
  - spec/support/common_objects.rb
180
183
  - spec/support/context_logged_in.rb
184
+ - spec/support/context_stub_session.rb
181
185
  - spec/support/cover_me.rb
182
186
  - spec/support/enumerable_comparison.rb
183
187
  - spec/support/shared_for_callbacks.rb
@@ -215,9 +219,9 @@ require_paths:
215
219
  required_ruby_version: !ruby/object:Gem::Requirement
216
220
  none: false
217
221
  requirements:
218
- - - ~>
222
+ - - ! '>='
219
223
  - !ruby/object:Gem::Version
220
- version: '1.8'
224
+ version: '1.9'
221
225
  required_rubygems_version: !ruby/object:Gem::Requirement
222
226
  none: false
223
227
  requirements:
@@ -226,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
230
  version: '0'
227
231
  requirements: []
228
232
  rubyforge_project:
229
- rubygems_version: 1.8.12
233
+ rubygems_version: 1.8.15
230
234
  signing_key:
231
235
  specification_version: 3
232
236
  summary: Hallon allows you to write Ruby applications utilizing the official Spotify
@@ -238,6 +242,7 @@ test_files:
238
242
  - spec/hallon/album_spec.rb
239
243
  - spec/hallon/artist_browse_spec.rb
240
244
  - spec/hallon/artist_spec.rb
245
+ - spec/hallon/audio_queue_spec.rb
241
246
  - spec/hallon/base_spec.rb
242
247
  - spec/hallon/enumerator_spec.rb
243
248
  - spec/hallon/error_spec.rb
@@ -259,7 +264,6 @@ test_files:
259
264
  - spec/hallon/player_spec.rb
260
265
  - spec/hallon/playlist_container_spec.rb
261
266
  - spec/hallon/playlist_spec.rb
262
- - spec/hallon/queue_spec.rb
263
267
  - spec/hallon/search_spec.rb
264
268
  - spec/hallon/session_spec.rb
265
269
  - spec/hallon/spotify_spec.rb
@@ -272,8 +276,10 @@ test_files:
272
276
  - spec/mockspotify/mockspotify_spec.rb
273
277
  - spec/spec_helper.rb
274
278
  - spec/support/.gitkeep
279
+ - spec/support/audio_driver_mock.rb
275
280
  - spec/support/common_objects.rb
276
281
  - spec/support/context_logged_in.rb
282
+ - spec/support/context_stub_session.rb
277
283
  - spec/support/cover_me.rb
278
284
  - spec/support/enumerable_comparison.rb
279
285
  - spec/support/shared_for_callbacks.rb
data/lib/hallon/queue.rb DELETED
@@ -1,71 +0,0 @@
1
- # coding: utf-8
2
- require 'thread'
3
-
4
- module Hallon
5
- # Hallon::Queue is a non-blocking (well, not entirely) sized FIFO queue.
6
- #
7
- # You initialize the queue with a `max_size`, and then push data to it.
8
- # For every push operation, the Queue will tell you how much of your data
9
- # it could consume. If the queue becomes full, it won’t accept any more
10
- # data (and will return 0 on the #push operation) until you pull some data
11
- # out of it with #pop.
12
- #
13
- # Hallon::Queue is useful for handling {Hallon::Observable::Session#music_delivery_callback}.
14
- #
15
- # @example
16
- # queue = Hallon::Queue.new(4)
17
- # queue.push([1, 2]) # => 2
18
- # queue.push([3]) # => 1
19
- # queue.push([4, 5, 6]) # => 1
20
- # queue.push([5, 6]) # => 0
21
- # queue.pop(1) # => [1]
22
- # queue.push([5, 6]) # => 1
23
- # queue.pop # => [2, 3, 4, 5]
24
- class Queue
25
- attr_reader :max_size
26
-
27
- # @param [Integer] max_size
28
- def initialize(max_size)
29
- @mutex = Mutex.new
30
- @condv = ConditionVariable.new
31
-
32
- @max_size = max_size
33
- @samples = []
34
- end
35
-
36
- # @param [#take] data
37
- # @return [Integer] how much of the data that was added to the queue
38
- def push(samples)
39
- synchronize do
40
- can_accept = max_size - size
41
- new_samples = samples.take(can_accept)
42
-
43
- @samples.concat(new_samples)
44
- @condv.signal
45
-
46
- new_samples.size
47
- end
48
- end
49
-
50
- # @note If the queue is empty, this operation will block until data is available.
51
- # @param [Integer] num_samples max number of samples to pop off the queue
52
- # @return [Array] data, where data.size might be less than num_samples but never more
53
- def pop(num_samples = max_size)
54
- synchronize do
55
- @condv.wait(@mutex) while @samples.empty?
56
- @samples.shift(num_samples)
57
- end
58
- end
59
-
60
- # @return [Integer] number of samples in buffer
61
- def size
62
- @samples.size
63
- end
64
-
65
- private
66
- # @yield (merely a wrapper over @mutex.synchronize)
67
- def synchronize
68
- @mutex.synchronize { return yield }
69
- end
70
- end
71
- end
@@ -1,35 +0,0 @@
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