spotify 8.0.2 → 8.0.5

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.
@@ -1,3 +1,4 @@
1
1
  module Spotify
2
- VERSION = [8, 0, 2].join('.')
2
+ # See README for versioning policy.
3
+ VERSION = [8, 0, 5].join('.')
3
4
  end
@@ -4,26 +4,28 @@ rescue LoadError
4
4
  retry if require 'rubygems'
5
5
  end
6
6
 
7
+ require 'minitest/autorun'
8
+
7
9
  #
8
10
  # Hooking FFI for extra introspection
9
- #
11
+ #
10
12
  require 'ffi'
11
13
 
12
14
  module Spotify
13
15
  extend FFI::Library
14
16
  extend self
15
-
17
+
16
18
  def attach_function(name, func, arguments, returns = nil, options = nil)
17
19
  args = [name, func, arguments, returns, options].compact
18
20
  args.unshift name.to_s if func.is_a?(Array)
19
-
21
+
20
22
  hargs = [:name, :func, :args, :returns].zip args
21
23
  @attached_methods ||= {}
22
24
  @attached_methods[name.to_s] = hash = Hash[hargs]
23
-
25
+
24
26
  super
25
27
  end
26
-
28
+
27
29
  attr_reader :attached_methods
28
30
  end
29
31
 
@@ -31,44 +33,105 @@ Bundler.require(:default, :development)
31
33
 
32
34
  #
33
35
  # Utility
34
- #
36
+ #
35
37
  API_H_PATH = File.expand_path('../api.h', __FILE__)
36
38
  API_H_SRC = File.read API_H_PATH
37
39
  API_H_XML = RbGCCXML.parse(API_H_PATH)
38
40
 
39
41
  #
40
42
  # General
41
- #
43
+ #
42
44
  describe Spotify do
43
45
  describe "VERSION" do
44
46
  it "should be defined" do
45
47
  defined?(Spotify::VERSION).must_equal "constant"
46
48
  end
47
-
49
+
48
50
  it "should be the same version as in api.h" do
49
51
  spotify_version = API_H_SRC.match(/#define\s+SPOTIFY_API_VERSION\s+(\d+)/)[1]
50
52
  Spotify::API_VERSION.must_equal spotify_version.to_i
51
53
  end
52
54
  end
55
+
56
+ describe Spotify::SessionConfig do
57
+ it "allows setting boolean values with bools" do
58
+ subject = Spotify::SessionConfig.new
59
+
60
+ subject[:compress_playlists].must_equal false
61
+ subject[:dont_save_metadata_for_playlists].must_equal false
62
+ subject[:initially_unload_playlists].must_equal false
63
+
64
+ subject[:compress_playlists] = true
65
+ subject[:dont_save_metadata_for_playlists] = true
66
+ subject[:initially_unload_playlists] = true
67
+
68
+ subject[:compress_playlists].must_equal true
69
+ subject[:dont_save_metadata_for_playlists].must_equal true
70
+ subject[:initially_unload_playlists].must_equal true
71
+ end
72
+ end
73
+
74
+ describe Spotify::OfflineSyncStatus do
75
+ it "allows setting boolean values with bools" do
76
+ subject = Spotify::OfflineSyncStatus.new
77
+
78
+ subject[:syncing].must_equal false
79
+ subject[:syncing] = true
80
+ subject[:syncing].must_equal true
81
+ end
82
+ end
53
83
  end
54
84
 
55
85
  describe "functions" do
56
86
  API_H_XML.functions.each do |func|
57
87
  next unless func["name"] =~ /\Asp_/
58
88
  attached_name = func["name"].sub(/\Asp_/, '')
59
-
89
+
90
+ def type_of(type, return_type = false)
91
+ return case type.to_cpp
92
+ when "const char*"
93
+ :string
94
+ when /\A(::)?(char|int|size_t|sp_session\*)\*/
95
+ return_type ? :pointer : :buffer_out
96
+ when /::(.+_cb)\*/
97
+ $1.to_sym
98
+ else :pointer
99
+ end if type.is_a?(RbGCCXML::PointerType)
100
+
101
+ case type["name"]
102
+ when "unsigned int"
103
+ :uint
104
+ else
105
+ type["name"].sub(/\Asp_/, '').to_sym
106
+ end
107
+ end
108
+
60
109
  describe func["name"] do
61
110
  it "should be attached" do
62
111
  Spotify.must_respond_to attached_name
63
112
  end
64
-
113
+
65
114
  it "should expect the correct number of arguments" do
66
115
  Spotify.attached_methods[attached_name][:args].count.
67
116
  must_equal func.arguments.count
68
117
  end
69
-
70
- # it "should expect the correct types of arguments"
71
- # it "should return the correct type"
118
+
119
+ it "should return the correct type" do
120
+ current = Spotify.attached_methods[attached_name][:returns]
121
+ actual = type_of(func.return_type, true)
122
+
123
+ Spotify.find_type(current).must_equal Spotify.find_type(actual)
124
+ end
125
+
126
+ it "should expect the correct types of arguments" do
127
+ current = Spotify.attached_methods[attached_name][:args]
128
+ actual = func.arguments.map { |arg| type_of(arg.cpp_type) }
129
+
130
+ current = current.map { |x| Spotify.find_type(x) }
131
+ actual = actual.map { |x| Spotify.find_type(x) }
132
+
133
+ current.must_equal actual
134
+ end
72
135
  end
73
136
  end
74
137
  end
@@ -76,26 +139,26 @@ end
76
139
  describe "enums" do
77
140
  API_H_XML.enumerations.each do |enum|
78
141
  attached_enum = Spotify.enum_type enum["name"].sub(/\Asp_/, '').to_sym
79
- original_enum = enum.values.map { |v| [v["name"].downcase, v["init"]] } # TODO: SP_BITRATE_X => X
80
-
142
+ original_enum = enum.values.map { |v| [v["name"].downcase, v["init"]] }
143
+
81
144
  describe enum["name"] do
82
145
  it "should exist" do
83
146
  attached_enum.wont_be_nil
84
147
  end
85
-
148
+
86
149
  it "should match the definition" do
87
150
  attached_enum_map = attached_enum.symbol_map
88
151
  original_enum.each do |(name, value)|
89
152
  a_name, a_value = attached_enum_map.find { |(n, v)| name.match n.to_s }
90
153
  attached_enum_map.delete(a_name)
91
-
154
+
92
155
  unless a_value.to_s == value.to_s
93
156
  p enum["name"]
94
157
  p [name, value]
95
158
  p [a_name, a_value]
96
159
  puts
97
160
  end
98
-
161
+
99
162
  a_value.to_s.must_equal value
100
163
  end
101
164
  end
@@ -106,13 +169,13 @@ end
106
169
  describe "structs" do
107
170
  API_H_XML.structs.each do |struct|
108
171
  next if struct["incomplete"]
109
-
172
+
110
173
  attached_struct = Spotify.constants.find do |const|
111
174
  struct["name"].gsub('_', '').match(/#{const}/i)
112
175
  end
113
-
176
+
114
177
  attached_members = Spotify.const_get(attached_struct).members.map(&:to_s)
115
-
178
+
116
179
  describe struct["name"] do
117
180
  it "should contain the same attributes" do
118
181
  struct.variables.map(&:name).each do |member|
@@ -121,4 +184,4 @@ describe "structs" do
121
184
  end
122
185
  end
123
186
  end
124
- end
187
+ end
@@ -8,20 +8,19 @@ Gem::Specification.new do |gem|
8
8
  gem.authors = ["Kim Burgestrand"]
9
9
  gem.email = ['kim@burgestrand.se']
10
10
  gem.license = 'X11 License'
11
-
11
+
12
12
  gem.files = `git ls-files`.split("\n")
13
13
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
14
  gem.executables = []
15
15
  gem.require_paths = ["lib"]
16
-
16
+
17
17
  gem.version = Spotify::VERSION
18
18
  gem.platform = Gem::Platform::RUBY
19
-
19
+
20
20
  gem.requirements << 'libspotify, v0.0.8'
21
21
  gem.add_dependency 'ffi', '~> 1.0.0'
22
22
  gem.add_development_dependency 'yard'
23
23
  gem.add_development_dependency 'rbgccxml'
24
- gem.add_development_dependency 'turn'
25
24
  gem.add_development_dependency 'minitest', '~> 2.0.0'
26
25
  gem.add_development_dependency 'bundler', '~> 1.0.0'
27
- end
26
+ end
metadata CHANGED
@@ -1,135 +1,115 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: spotify
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 8.0.5
4
5
  prerelease:
5
- version: 8.0.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Kim Burgestrand
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-05-30 00:00:00 +02:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-07-11 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: ffi
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2151880520 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
18
+ requirements:
22
19
  - - ~>
23
- - !ruby/object:Gem::Version
20
+ - !ruby/object:Gem::Version
24
21
  version: 1.0.0
25
22
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: yard
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2151880520
25
+ - !ruby/object:Gem::Dependency
26
+ name: yard
27
+ requirement: &2151879600 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
36
33
  type: :development
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: rbgccxml
40
34
  prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *2151879600
36
+ - !ruby/object:Gem::Dependency
37
+ name: rbgccxml
38
+ requirement: &2151878420 !ruby/object:Gem::Requirement
42
39
  none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
47
44
  type: :development
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: turn
51
45
  prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- version: "0"
58
- type: :development
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
46
+ version_requirements: *2151878420
47
+ - !ruby/object:Gem::Dependency
61
48
  name: minitest
62
- prerelease: false
63
- requirement: &id005 !ruby/object:Gem::Requirement
49
+ requirement: &2151877500 !ruby/object:Gem::Requirement
64
50
  none: false
65
- requirements:
51
+ requirements:
66
52
  - - ~>
67
- - !ruby/object:Gem::Version
53
+ - !ruby/object:Gem::Version
68
54
  version: 2.0.0
69
55
  type: :development
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
72
- name: bundler
73
56
  prerelease: false
74
- requirement: &id006 !ruby/object:Gem::Requirement
57
+ version_requirements: *2151877500
58
+ - !ruby/object:Gem::Dependency
59
+ name: bundler
60
+ requirement: &2151876460 !ruby/object:Gem::Requirement
75
61
  none: false
76
- requirements:
62
+ requirements:
77
63
  - - ~>
78
- - !ruby/object:Gem::Version
64
+ - !ruby/object:Gem::Version
79
65
  version: 1.0.0
80
66
  type: :development
81
- version_requirements: *id006
67
+ prerelease: false
68
+ version_requirements: *2151876460
82
69
  description:
83
- email:
70
+ email:
84
71
  - kim@burgestrand.se
85
72
  executables: []
86
-
87
73
  extensions: []
88
-
89
74
  extra_rdoc_files: []
90
-
91
- files:
75
+ files:
92
76
  - .gemtest
93
77
  - .gitignore
94
- - .yardopts
95
78
  - Gemfile
96
79
  - LICENSE
97
80
  - README.markdown
98
81
  - Rakefile
99
82
  - lib/spotify.rb
100
83
  - lib/spotify/version.rb
101
- - lib/yard-ffi-plugin.rb
102
84
  - spec/api.h
103
85
  - spec/spotify_spec.rb
104
86
  - spotify.gemspec
105
- has_rdoc: true
106
87
  homepage: https://github.com/Burgestrand/libspotify-ruby
107
- licenses:
88
+ licenses:
108
89
  - X11 License
109
90
  post_install_message:
110
91
  rdoc_options: []
111
-
112
- require_paths:
92
+ require_paths:
113
93
  - lib
114
- required_ruby_version: !ruby/object:Gem::Requirement
94
+ required_ruby_version: !ruby/object:Gem::Requirement
115
95
  none: false
116
- requirements:
117
- - - ">="
118
- - !ruby/object:Gem::Version
119
- version: "0"
120
- required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
101
  none: false
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: "0"
126
- requirements:
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements:
127
107
  - libspotify, v0.0.8
128
108
  rubyforge_project:
129
- rubygems_version: 1.6.2
109
+ rubygems_version: 1.8.5
130
110
  signing_key:
131
111
  specification_version: 3
132
112
  summary: Bare-bones Ruby bindings for libspotify
133
- test_files:
113
+ test_files:
134
114
  - spec/api.h
135
115
  - spec/spotify_spec.rb
data/.yardopts DELETED
@@ -1 +0,0 @@
1
- -e ./lib/yard-ffi-plugin.rb
@@ -1,44 +0,0 @@
1
- class FFIHandler < YARD::Handlers::Ruby::Base
2
- include YARD::Tags
3
-
4
- handles method_call(:attach_function)
5
-
6
- process do
7
- # Extract parameters
8
- parameters = statement.parameters.children
9
-
10
- # Extract actual arguments
11
- parameters.unshift parameters[0] if parameters[1].type == :array
12
-
13
- # TODO: Resolve all arguments (if they are variables)
14
-
15
- # Normalize all arguments to string values
16
- literalizer = proc do |node|
17
- case node.type
18
- when :array # args: [:type, :type]
19
- node[0].map(&literalizer)
20
- when :fcall # callback([:type, :type], :type)
21
- name = node.jump(:ident)[0]
22
- args, rett = node.jump(:arg_paren)[0].children.map(&literalizer)
23
- "%s(%s):%s" % [name, args.join(', '), rett]
24
- else
25
- node.jump(:tstring_content, :ident)[0].sub("void", "nil")
26
- end
27
- end
28
- parameters.map!(&literalizer)
29
-
30
- # Now, we have all we need!
31
- name, cfunc, args, returns = parameters
32
-
33
- # Register the newly created method
34
- method = register MethodObject.new(namespace, name, :class)
35
-
36
- # Construct the final docstring
37
- overload = OverloadTag.new(:overload, "#{name}(#{args.join(', ')})")
38
- method.docstring.add_tag overload
39
- args.each do |type|
40
- overload.docstring.add_tag Tag.new(:param, nil, type)
41
- end
42
- overload.docstring.add_tag Tag.new(:return, nil, returns)
43
- end
44
- end