hallon 0.16.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +22 -1
  4. data/Gemfile +2 -2
  5. data/README.markdown +2 -2
  6. data/Rakefile +69 -42
  7. data/hallon.gemspec +1 -1
  8. data/lib/hallon.rb +3 -2
  9. data/lib/hallon/album.rb +6 -4
  10. data/lib/hallon/artist.rb +6 -4
  11. data/lib/hallon/audio_queue.rb +1 -1
  12. data/lib/hallon/base.rb +4 -0
  13. data/lib/hallon/blob.rb +6 -0
  14. data/lib/hallon/error.rb +10 -41
  15. data/lib/hallon/ext/spotify.rb +1 -146
  16. data/lib/hallon/image.rb +8 -0
  17. data/lib/hallon/linkable.rb +6 -0
  18. data/lib/hallon/loadable.rb +6 -0
  19. data/lib/hallon/observable.rb +1 -1
  20. data/lib/hallon/observable/playlist_container.rb +2 -2
  21. data/lib/hallon/observable/session.rb +34 -0
  22. data/lib/hallon/player.rb +7 -3
  23. data/lib/hallon/playlist.rb +5 -1
  24. data/lib/hallon/playlist_container.rb +9 -8
  25. data/lib/hallon/scrobbler.rb +103 -0
  26. data/lib/hallon/search.rb +1 -0
  27. data/lib/hallon/session.rb +69 -13
  28. data/lib/hallon/toplist.rb +1 -1
  29. data/lib/hallon/track.rb +2 -2
  30. data/lib/hallon/version.rb +1 -1
  31. data/spec/hallon/album_spec.rb +16 -0
  32. data/spec/hallon/artist_spec.rb +16 -0
  33. data/spec/hallon/base_spec.rb +1 -1
  34. data/spec/hallon/error_spec.rb +3 -3
  35. data/spec/hallon/hallon_spec.rb +1 -1
  36. data/spec/hallon/image_spec.rb +6 -0
  37. data/spec/hallon/observable/session_spec.rb +20 -0
  38. data/spec/hallon/scrobbler_spec.rb +119 -0
  39. data/spec/hallon/session_spec.rb +38 -4
  40. data/spec/hallon/spotify_spec.rb +0 -45
  41. data/spec/mockspotify.rb +6 -1
  42. data/spec/spec_helper.rb +4 -5
  43. metadata +59 -20
  44. data/spec/support/cover_me.rb +0 -7
@@ -38,6 +38,20 @@ describe Hallon::Session do
38
38
  it "should fail on a huge user agent (> 255 characters)" do
39
39
  expect { create_session(true, :user_agent => 'a' * 256) }.to raise_error(ArgumentError)
40
40
  end
41
+
42
+ it "should extract the proxy username and password" do
43
+ session = create_session(true, :proxy => "socks5://kim:pass@batm.an")
44
+ session.options[:proxy].should eq "socks5://batm.an"
45
+ session.options[:proxy_username].should eq "kim"
46
+ session.options[:proxy_password].should eq "pass"
47
+ end
48
+
49
+ it "should not override the given username or password" do
50
+ session = create_session(true, :proxy => "socks5://kim:pass@batm.an", :proxy_username => "batman", :proxy_password => "hidden identity")
51
+ session.options[:proxy].should eq "socks5://batm.an"
52
+ session.options[:proxy_username].should eq "batman"
53
+ session.options[:proxy_password].should eq "hidden identity"
54
+ end
41
55
  end
42
56
 
43
57
  describe "options" do
@@ -70,7 +84,7 @@ describe Hallon::Session do
70
84
 
71
85
  describe "#relogin" do
72
86
  it "should raise if no credentials have been saved" do
73
- expect { session.relogin }.to raise_error(Hallon::Error)
87
+ expect { session.relogin }.to raise_error(Spotify::Error)
74
88
  end
75
89
 
76
90
  it "should not raise if credentials have been saved" do
@@ -81,6 +95,17 @@ describe Hallon::Session do
81
95
  end
82
96
  end
83
97
 
98
+ describe "#username" do
99
+ it "should be nil if no username is stored in libspotify" do
100
+ session.username.should eq nil
101
+ end
102
+
103
+ it "should retrieve the current user’s name if logged in" do
104
+ session.login 'Kim', 'pass'
105
+ session.username.should eq 'Kim'
106
+ end
107
+ end
108
+
84
109
  describe "#remembered_user" do
85
110
  it "should be nil if no username is stored in libspotify" do
86
111
  session.remembered_user.should eq nil
@@ -160,6 +185,15 @@ describe Hallon::Session do
160
185
  end
161
186
  end
162
187
 
188
+ describe "#private= and #private?" do
189
+ it "sets session privacy mode" do
190
+ session.private = false
191
+ session.should_not be_private
192
+ session.private = true
193
+ session.should be_private
194
+ end
195
+ end
196
+
163
197
  describe "#cache_size" do
164
198
  it "should default to 0" do
165
199
  session.cache_size.should eq 0
@@ -247,13 +281,13 @@ describe Hallon::Session do
247
281
 
248
282
  describe "#offline_bitrate=" do
249
283
  it "should not resync unless explicitly told so" do
250
- Spotify.should_receive(:session_preferred_offline_bitrate).with(session.pointer, :'96k', false)
284
+ Spotify.should_receive(:session_preferred_offline_bitrate).with(session.pointer, :'96k', false).and_return(:ok)
251
285
  session.offline_bitrate = :'96k'
252
286
  end
253
287
 
254
288
  it "should resync if asked to" do
255
- Spotify.should_receive(:session_preferred_offline_bitrate).with(session.pointer, :'96k', true)
256
- session.offline_bitrate = :'96k', true
289
+ Spotify.should_receive(:session_preferred_offline_bitrate).with(session.pointer, :'96k', true).and_return(:ok)
290
+ session.offline_bitrate = :'96k', :resync
257
291
  end
258
292
 
259
293
  it "should fail given an invalid value" do
@@ -1,49 +1,4 @@
1
1
  describe Spotify do
2
- describe "a wrapped function" do
3
- let(:null_pointer) { FFI::Pointer.new(0) }
4
- subject do
5
- Spotify.should_receive(:session_user).and_return(null_pointer)
6
- Spotify.session_user!(session)
7
- end
8
-
9
- it "should return a Spotify::Pointer" do
10
- subject.should be_a Spotify::Pointer
11
- end
12
-
13
- it "should not add ref when the result is nil" do
14
- Spotify.should_not_receive(:user_add_ref)
15
- subject.should be_null
16
- end
17
- end
18
-
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
2
  describe Spotify::CallbackStruct do
48
3
  subject { Spotify::SessionCallbacks.new }
49
4
  it { should be_a Spotify::CallbackStruct }
data/spec/mockspotify.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require 'ffi'
2
3
  require 'rbconfig'
3
4
 
@@ -14,9 +15,12 @@ module Spotify
14
15
  end
15
16
 
16
17
  # Overriden to not throw an error on missing functions.
17
- def attach_function(*)
18
+ def attach_function(name, *)
18
19
  super
19
20
  rescue FFI::NotFoundError => e
21
+ define_singleton_method(name) do |*args|
22
+ raise FFI::NotFoundError, "#{name} has not been defined"
23
+ end
20
24
  warn "#{e.message}" if $VERBOSE
21
25
  end
22
26
  end
@@ -79,6 +83,7 @@ module Spotify
79
83
 
80
84
  # mocked accessors
81
85
  attach_function :mocksp_playlist_get_autolink_tracks, [:playlist], :bool
86
+ attach_function :mocksp_session_set_is_scrobbling_possible, [:session, :social_provider, :bool], :void
82
87
 
83
88
  $VERBOSE = old_verbose
84
89
  end
data/spec/spec_helper.rb CHANGED
@@ -3,11 +3,10 @@
3
3
  require 'bundler'
4
4
  Bundler.setup
5
5
 
6
- begin
7
- require 'cover_me'
8
- rescue LoadError
9
- # ignore, only for development, it’s in the Gemfile
10
- end
6
+ SimpleCov.start do
7
+ add_filter 'spec/'
8
+ add_filter 'vendor/'
9
+ end if defined?(SimpleCov)
11
10
 
12
11
  require 'mockspotify'
13
12
  require 'hallon'
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.16.0
4
+ version: 0.17.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: 2012-05-07 00:00:00.000000000 Z
12
+ date: 2012-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ref
16
- requirement: &70343012134120 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,21 +21,31 @@ dependencies:
21
21
  version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70343012134120
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: spotify
27
- requirement: &70343012131940 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
31
36
  - !ruby/object:Gem::Version
32
- version: 11.0.2
37
+ version: 12.0.2
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70343012131940
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 12.0.2
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rake
38
- requirement: &70343012130580 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0.8'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70343012130580
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rspec
49
- requirement: &70343012128740 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ~>
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '2'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70343012128740
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: yard
60
- requirement: &70343012127800 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70343012127800
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: bundler
71
- requirement: &70343012126280 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70343012126280
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: rdiscount
82
- requirement: &70343012278320 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,7 +117,12 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70343012278320
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  description:
92
127
  email: kim@burgestrand.se
93
128
  executables: []
@@ -144,6 +179,7 @@ files:
144
179
  - lib/hallon/player.rb
145
180
  - lib/hallon/playlist.rb
146
181
  - lib/hallon/playlist_container.rb
182
+ - lib/hallon/scrobbler.rb
147
183
  - lib/hallon/search.rb
148
184
  - lib/hallon/session.rb
149
185
  - lib/hallon/toplist.rb
@@ -180,6 +216,7 @@ files:
180
216
  - spec/hallon/player_spec.rb
181
217
  - spec/hallon/playlist_container_spec.rb
182
218
  - spec/hallon/playlist_spec.rb
219
+ - spec/hallon/scrobbler_spec.rb
183
220
  - spec/hallon/search_spec.rb
184
221
  - spec/hallon/session_spec.rb
185
222
  - spec/hallon/spotify_spec.rb
@@ -198,7 +235,6 @@ files:
198
235
  - spec/support/audio_driver_mock.rb
199
236
  - spec/support/common_objects.rb
200
237
  - spec/support/context_logged_in.rb
201
- - spec/support/cover_me.rb
202
238
  - spec/support/enumerable_comparison.rb
203
239
  - spec/support/image_mocks.rb
204
240
  - spec/support/playlist_container_mocks.rb
@@ -254,9 +290,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
290
  - - ! '>='
255
291
  - !ruby/object:Gem::Version
256
292
  version: '0'
293
+ segments:
294
+ - 0
295
+ hash: 995209467900648626
257
296
  requirements: []
258
297
  rubyforge_project:
259
- rubygems_version: 1.8.17
298
+ rubygems_version: 1.8.24
260
299
  signing_key:
261
300
  specification_version: 3
262
301
  summary: Hallon allows you to write Ruby applications utilizing the official Spotify
@@ -292,6 +331,7 @@ test_files:
292
331
  - spec/hallon/player_spec.rb
293
332
  - spec/hallon/playlist_container_spec.rb
294
333
  - spec/hallon/playlist_spec.rb
334
+ - spec/hallon/scrobbler_spec.rb
295
335
  - spec/hallon/search_spec.rb
296
336
  - spec/hallon/session_spec.rb
297
337
  - spec/hallon/spotify_spec.rb
@@ -310,7 +350,6 @@ test_files:
310
350
  - spec/support/audio_driver_mock.rb
311
351
  - spec/support/common_objects.rb
312
352
  - spec/support/context_logged_in.rb
313
- - spec/support/cover_me.rb
314
353
  - spec/support/enumerable_comparison.rb
315
354
  - spec/support/image_mocks.rb
316
355
  - spec/support/playlist_container_mocks.rb
@@ -1,7 +0,0 @@
1
- if defined?(CoverMe)
2
- CoverMe.config do |c|
3
- c.project.root = Dir.pwd
4
- c.at_exit = proc {} # default hook opens coverage/ folder, ANNOYING!
5
- c.file_pattern = [%r"#{c.project.root}/lib/.+\.rb"]
6
- end
7
- end