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.
- data/lib/spotify.rb +371 -322
- data/lib/spotify/version.rb +2 -1
- data/spec/spotify_spec.rb +85 -22
- data/spotify.gemspec +4 -5
- metadata +56 -76
- data/.yardopts +0 -1
- data/lib/yard-ffi-plugin.rb +0 -44
data/lib/spotify/version.rb
CHANGED
data/spec/spotify_spec.rb
CHANGED
@@ -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
|
-
|
71
|
-
|
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"]] }
|
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
|
data/spotify.gemspec
CHANGED
@@ -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
|
-
|
14
|
-
|
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
|
-
|
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
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
53
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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:
|
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:
|
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.
|
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
|
data/lib/yard-ffi-plugin.rb
DELETED
@@ -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
|