spotify 8.0.2 → 8.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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