jberkel-spotify-api 0.0.2 → 0.0.3

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/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  pkg
2
+ coverage
data/CHANGELOG ADDED
@@ -0,0 +1,6 @@
1
+ == 0.0.2 / 2009-08-05
2
+ * Fix option parser bug
3
+
4
+ == 0.0.1 / 2009-08-04
5
+ * First release to github
6
+
data/Rakefile CHANGED
@@ -26,6 +26,14 @@ Spec::Rake::SpecTask.new do |t|
26
26
  t.libs << "./lib"
27
27
  end
28
28
 
29
+ desc "runs specs with rcov"
30
+ Spec::Rake::SpecTask.new('spec:coverage') do |t|
31
+ t.rcov = true
32
+ t.spec_files = FileList["spec/**/*_spec.rb"].delete_if { |f| f =~ /integration/ }
33
+ t.libs << "./lib"
34
+ t.rcov_opts = ['--exclude', 'spec/.*rb,\(__.+__\)']
35
+ end
36
+
29
37
  Spec::Rake::SpecTask.new(:integration) do |t|
30
38
  t.rcov = false
31
39
  t.spec_files = FileList["spec/**/*_spec.rb"].select { |f| f =~ /integration/ }
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 2
2
+ :patch: 3
3
3
  :major: 0
4
4
  :minor: 0
@@ -6,17 +6,14 @@ require 'json'
6
6
  require 'pp'
7
7
 
8
8
  puts "creating a new playlist"
9
- resp = RestClient.post 'http://localhost:3000/playlists', :name=>'my shiny playlist'
9
+ resp = RestClient.post('http://localhost:3000/playlists', {
10
+ "name"=>'my shiny playlist',
11
+ "tracks" => [ {'id'=>'6qHiOf1BFCQIzAjJsRbMfY'}, {'id'=>'1VaucR6Bsks5Q9bYBsXvuF'} ]
12
+ }.to_json)
13
+
10
14
  if resp.code == 201
11
15
  location = resp.headers[:location]
12
16
  puts "201 created (#{location})"
13
- spotify_id = location[location.rindex('/')+1..-1]
14
-
15
- puts "adding some tracks to it"
16
- resp = RestClient.put "http://localhost:3000/playlists/#{spotify_id}", {
17
- "tracks" => [ {'id'=>'6qHiOf1BFCQIzAjJsRbMfY'}, {'id'=>'1VaucR6Bsks5Q9bYBsXvuF'} ]
18
- }.to_json
19
- puts resp
20
17
  else
21
18
  raise resp.to_s
22
19
  end
data/lib/jotify.rb CHANGED
@@ -49,9 +49,9 @@ class Jotify
49
49
  @jotify.playlists.map { |p| playlist(p.getId()) }
50
50
  end
51
51
 
52
- def playlist(id)
52
+ def playlist(id, resolve_tracks=false)
53
53
  playlist = @jotify.playlist(Jotify.resolve_id(id))
54
- unless playlist.tracks.empty?
54
+ if resolve_tracks && !playlist.tracks.empty?
55
55
  res = @jotify.browse(playlist.tracks)
56
56
  res.tracks.each_with_index do |t,i|
57
57
  playlist.tracks.set(i, t)
data/lib/jotify/api.rb CHANGED
@@ -82,9 +82,16 @@ end
82
82
 
83
83
  Sinatra::Application.post('/playlists') do
84
84
  content_type :json
85
- name, collaborative = params[:name], params[:collaborative] == 'true'
86
- playlist = jotify.create_playlist(name, collaborative)
85
+ body = request.body.read
86
+ data = JSON.parse(body)
87
+ playlist = jotify.create_playlist(data['name'], data['collaborative'])
87
88
  if playlist
89
+ if data['tracks']
90
+ ids = data['tracks'].map { |t| t['id'] }
91
+ unless jotify.add_tracks_to_playlist(playlist, ids)
92
+ return 500, 'status' => 'ERROR', 'message' => 'playlist created but tracks could not be added'
93
+ end
94
+ end
88
95
  redirect playlist.link, 201 # created
89
96
  else
90
97
  return 500, { 'status' => 'ERROR', 'message' => 'playlist could not be created' }.to_json
data/lib/jotify/media.rb CHANGED
@@ -22,6 +22,10 @@ module Java
22
22
  def each(&block)
23
23
  tracks.each(&block)
24
24
  end
25
+
26
+ def size
27
+ tracks.size
28
+ end
25
29
 
26
30
  def inspect
27
31
  "[Playlist: #{self.getId()} #{getTracks.to_a}]"
@@ -38,6 +42,10 @@ module Java
38
42
  :collaborative => collaborative
39
43
  }
40
44
  end
45
+
46
+ def <<(track)
47
+ tracks.add(track) if track.is_a?(Track)
48
+ end
41
49
  end
42
50
 
43
51
  class PlaylistContainer
@@ -46,6 +54,12 @@ module Java
46
54
  def each(&block)
47
55
  playlists.each(&block)
48
56
  end
57
+
58
+ def size() playlists.size end
59
+
60
+ def <<(pl)
61
+ playlists.add(pl) if pl.is_a?(Playlist)
62
+ end
49
63
  end
50
64
 
51
65
  class Result
@@ -30,4 +30,25 @@ describe "Integration" do
30
30
  end
31
31
  end
32
32
 
33
+
34
+ describe "playlists" do
35
+
36
+ before do
37
+ @playlists = @jotify.playlists
38
+ @playlists.should_not be_empty
39
+ end
40
+
41
+ it "should return name and id, not tracks (GH-3)" do
42
+ @playlists.each do |pl|
43
+ puts pl.inspect
44
+ pl.name.should_not be_nil
45
+
46
+ pl.tracks.each do |t|
47
+ t.getId().should_not be_nil
48
+ t.getName().should be_nil
49
+ end
50
+ end
51
+ end
52
+ end
53
+
33
54
  end
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env jruby -S spec
2
- require File.join(File.dirname(__FILE__), 'spec_helper')
2
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
3
3
 
4
4
  require 'jotify/api'
5
5
  require 'rack/test'
@@ -84,6 +84,7 @@ describe 'Api' do
84
84
  before do
85
85
  #String id, String name, String author, boolean collaborative
86
86
  @playlist = Jotify::Media::Playlist.new("4d921ebcdd8c80f32ce1ed5acafbb9c8", "my shiny playlist", "test", false)
87
+
87
88
  end
88
89
 
89
90
  describe "get" do
@@ -136,10 +137,31 @@ describe 'Api' do
136
137
  describe "create/update" do
137
138
  it "should create a playlist when posting to /playlists" do
138
139
  @jotify.should_receive(:create_playlist).with('my shiny playlist', true).and_return(@playlist)
139
- post '/playlists', :name => 'my shiny playlist', :collaborative => 'true'
140
+ post '/playlists', { 'name' => 'my shiny playlist', 'collaborative' => true }.to_json
141
+ last_response.status.should == 201
142
+ last_response.headers['Location'].should == 'http://open.spotify.com/user/test/playlist/2mnbxTkghYtlHMdX3jdP9C'
143
+ end
144
+
145
+ it "should create a playlist and adding tracks when posting to /playlists" do
146
+ @jotify.should_receive(:create_playlist).with('my shiny playlist', true).and_return(@playlist)
147
+ @jotify.should_receive(:add_tracks_to_playlist).with(@playlist, ['1','2']).and_return(true)
148
+
149
+ post '/playlists', { 'name' => 'my shiny playlist',
150
+ 'collaborative' => true,
151
+ 'tracks' => [ {'id'=>'1' }, { 'id'=>'2' } ]
152
+ }.to_json
140
153
  last_response.status.should == 201
141
154
  last_response.headers['Location'].should == 'http://open.spotify.com/user/test/playlist/2mnbxTkghYtlHMdX3jdP9C'
142
155
  end
156
+
157
+
158
+ it "should return 500 if playlist could not be created" do
159
+ @jotify.should_receive(:create_playlist).with('my shiny playlist', true).and_return(nil)
160
+ post '/playlists', { :name => 'my shiny playlist', :collaborative =>true }.to_json
161
+ last_response.status.should == 500
162
+ json_response.should == {"status"=>"ERROR", "message"=>"playlist could not be created"}
163
+ end
164
+
143
165
 
144
166
  it "should update playlist when putting to /playlists/id" do
145
167
  @jotify.should_receive(:playlist).with("foo").and_return(@playlist)
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env jruby -S spec
2
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
3
+ require 'jotify'
4
+
5
+ describe Jotify::Media do
6
+
7
+ describe "an artist" do
8
+ before do
9
+ @artist = Jotify::Media::Artist.new(spotify_hex_id)
10
+ end
11
+
12
+ it "should implement to_h" do
13
+ @artist.to_h.should == {:id=>"4d921ebcdd8c80f32ce1ed5acafbb9c8", :popularity=>0.0, :url=>"http://open.spotify.com/artist/2mnbxTkghYtlHMdX3jdP9C", :name=>nil}
14
+ end
15
+ end
16
+
17
+ describe "a track" do
18
+ before do
19
+ @track = Jotify::Media::Track.new(spotify_hex_id)
20
+ end
21
+
22
+ it "should implement to_h" do
23
+ @track.to_h.should == {:id=>"4d921ebcdd8c80f32ce1ed5acafbb9c8", :popularity=>0.0, :url=>"http://open.spotify.com/track/2mnbxTkghYtlHMdX3jdP9C", :title=>nil, :artist=>nil, :album=>nil}
24
+ end
25
+ end
26
+
27
+ describe "an album" do
28
+ before do
29
+ @album = Jotify::Media::Album.new(spotify_hex_id)
30
+ end
31
+
32
+ it "should implement to_h" do
33
+ @album.to_h.should == {:id=>"4d921ebcdd8c80f32ce1ed5acafbb9c8", :popularity=>0.0, :url=>"http://open.spotify.com/album/2mnbxTkghYtlHMdX3jdP9C", :name=>nil, :artist=>nil, :year=>-1, :type=>nil}
34
+ end
35
+
36
+ it "should implement enumerable" do
37
+ @album.class.included_modules.should include(Enumerable)
38
+ @album.to_a.should == []
39
+ end
40
+ end
41
+
42
+ describe "a result" do
43
+ before do
44
+ @result = Jotify::Media::Result.new
45
+ end
46
+
47
+ it "should implement to_h" do
48
+ @result.to_h.should == {:artists=>[], :albums=>[], :tracks=>[]}
49
+ end
50
+
51
+ it "should implement enumerable" do
52
+ @result.class.included_modules.should include(Enumerable)
53
+ @result.respond_to?(:each).should be_true
54
+ @result.to_a.should == []
55
+ @result.inspect.should == "{:artists=>[], :albums=>[], :tracks=>[]}"
56
+ end
57
+ end
58
+
59
+ describe "playlists" do
60
+ before(:each) do
61
+ @p = Jotify::Media::Playlist.new
62
+ end
63
+
64
+ it "should implement enumerable, size, inspect" do
65
+ @p.class.included_modules.should include(Enumerable)
66
+ @p.respond_to?(:each).should be_true
67
+ 10.times { @p.tracks.add(Jotify::Media::Track.new) }
68
+ @p.size.should == 10
69
+ end
70
+
71
+ it "should implement inspect" do
72
+ @p.inspect.should == "[Playlist: ]"
73
+ end
74
+
75
+ it "should implement <<(track)" do
76
+ @t = Jotify::Media::Track.new(spotify_hex_id)
77
+ lambda {
78
+ @p << @t
79
+ }.should change(@p, :size).by(1)
80
+ @p.to_a.first.should == @t
81
+ end
82
+ end
83
+
84
+ describe "playlist container" do
85
+ before do
86
+ @container = Jotify::Media::PlaylistContainer.new
87
+ end
88
+
89
+ it "should implement enumerable" do
90
+ @container.respond_to?(:each).should be_true
91
+ @container.class.included_modules.should include(Enumerable)
92
+ @container.to_a.should == []
93
+ end
94
+
95
+ it "should implement size" do
96
+ @container.size.should == 0
97
+ end
98
+
99
+ it "should implement <<(playlist)" do
100
+ lambda {
101
+ 2.times { @container << empty_playlist }
102
+ }.should change(@container, :size).by(2)
103
+ end
104
+ end
105
+
106
+ end
data/spec/spec_helper.rb CHANGED
@@ -9,3 +9,28 @@ Spec::Runner.configure do |config|
9
9
  end
10
10
 
11
11
 
12
+ module Helpers
13
+ def spotify_hex_id
14
+ '4d921ebcdd8c80f32ce1ed5acafbb9c8'
15
+ end
16
+
17
+ def spotify_uri
18
+ '2mnbxTkghYtlHMdX3jdP9C'
19
+ end
20
+
21
+ def empty_playlist
22
+ Jotify::Media::Playlist.new
23
+ end
24
+
25
+ def empty_track
26
+ Jotify::Media::Track.new
27
+ end
28
+
29
+ def empty_album
30
+ Jotify::Media::Album.new
31
+ end
32
+ end
33
+
34
+ Spec::Example::ExampleMethods.send(:include, Helpers)
35
+
36
+
data/spotify-api.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{spotify-api}
5
- s.version = "0.0.2"
5
+ s.version = "0.0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Jan Berkel"]
9
- s.date = %q{2009-08-05}
9
+ s.date = %q{2009-08-07}
10
10
  s.default_executable = %q{spotify-api-server}
11
11
  s.description = %q{an api for spotify, based on jotify}
12
12
  s.email = %q{jan.berkel@gmail.com}
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  ]
18
18
  s.files = [
19
19
  ".gitignore",
20
+ "CHANGELOG",
20
21
  "LICENSE",
21
22
  "README.md",
22
23
  "Rakefile",
@@ -29,10 +30,10 @@ Gem::Specification.new do |s|
29
30
  "lib/jotify.rb",
30
31
  "lib/jotify/api.rb",
31
32
  "lib/jotify/media.rb",
32
- "spec/api_spec.rb",
33
33
  "spec/integration_spec.rb",
34
+ "spec/jotify/api_spec.rb",
35
+ "spec/jotify/media_spec.rb",
34
36
  "spec/jotify_spec.rb",
35
- "spec/media_spec.rb",
36
37
  "spec/spec_helper.rb",
37
38
  "spotify-api.gemspec"
38
39
  ]
@@ -42,10 +43,10 @@ Gem::Specification.new do |s|
42
43
  s.rubygems_version = %q{1.3.5}
43
44
  s.summary = %q{an api for spotify, based on jotify}
44
45
  s.test_files = [
45
- "spec/api_spec.rb",
46
- "spec/integration_spec.rb",
46
+ "spec/integration_spec.rb",
47
+ "spec/jotify/api_spec.rb",
48
+ "spec/jotify/media_spec.rb",
47
49
  "spec/jotify_spec.rb",
48
- "spec/media_spec.rb",
49
50
  "spec/spec_helper.rb",
50
51
  "examples/create_playlist.rb",
51
52
  "examples/list_playlists.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jberkel-spotify-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Berkel
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-05 00:00:00 -07:00
12
+ date: 2009-08-07 00:00:00 -07:00
13
13
  default_executable: spotify-api-server
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -63,6 +63,7 @@ extra_rdoc_files:
63
63
  - README.md
64
64
  files:
65
65
  - .gitignore
66
+ - CHANGELOG
66
67
  - LICENSE
67
68
  - README.md
68
69
  - Rakefile
@@ -75,10 +76,10 @@ files:
75
76
  - lib/jotify.rb
76
77
  - lib/jotify/api.rb
77
78
  - lib/jotify/media.rb
78
- - spec/api_spec.rb
79
79
  - spec/integration_spec.rb
80
+ - spec/jotify/api_spec.rb
81
+ - spec/jotify/media_spec.rb
80
82
  - spec/jotify_spec.rb
81
- - spec/media_spec.rb
82
83
  - spec/spec_helper.rb
83
84
  - spotify-api.gemspec
84
85
  has_rdoc: false
@@ -109,10 +110,10 @@ signing_key:
109
110
  specification_version: 3
110
111
  summary: an api for spotify, based on jotify
111
112
  test_files:
112
- - spec/api_spec.rb
113
113
  - spec/integration_spec.rb
114
+ - spec/jotify/api_spec.rb
115
+ - spec/jotify/media_spec.rb
114
116
  - spec/jotify_spec.rb
115
- - spec/media_spec.rb
116
117
  - spec/spec_helper.rb
117
118
  - examples/create_playlist.rb
118
119
  - examples/list_playlists.rb
data/spec/media_spec.rb DELETED
@@ -1,77 +0,0 @@
1
- #!/usr/bin/env jruby -S spec
2
- require File.join(File.dirname(__FILE__), 'spec_helper')
3
- require 'jotify'
4
-
5
- describe Jotify::Media do
6
-
7
- describe "an artist" do
8
- before do
9
- @artist = Jotify::Media::Artist.new
10
- end
11
-
12
- it "should implement to_h" do
13
- @artist.respond_to?(:to_h).should be_true
14
- end
15
- end
16
-
17
- describe "a track" do
18
- before do
19
- @track = Jotify::Media::Track.new
20
- end
21
-
22
- it "should implement to_h" do
23
- @track.respond_to?(:to_h).should be_true
24
- end
25
- end
26
-
27
- describe "an album" do
28
- before do
29
- @album = Jotify::Media::Album.new
30
- end
31
-
32
- it "should implement to_h" do
33
- @album.respond_to?(:to_h).should be_true
34
- end
35
-
36
- it "should implement enumerable" do
37
- @album.class.included_modules.should include(Enumerable)
38
- end
39
- end
40
-
41
- describe "a result" do
42
- before do
43
- @result = Jotify::Media::Result.new
44
- end
45
-
46
- it "should implement to_h" do
47
- @result.respond_to?(:to_h).should be_true
48
- end
49
-
50
- it "should implement enumerable" do
51
- @result.class.included_modules.should include(Enumerable)
52
- @result.respond_to?(:each).should be_true
53
- end
54
- end
55
-
56
- describe "playlists" do
57
- it "should implement enumerable" do
58
- p = Jotify::Media::Playlist.new
59
- p.class.included_modules.should include(Enumerable)
60
- p.respond_to?(:each).should be_true
61
- 10.times { p.tracks.add(Jotify::Media::Track.new) }
62
- p.to_a.size.should == 10
63
- end
64
- end
65
-
66
- describe "playlist container" do
67
- before do
68
- @container = Jotify::Media::PlaylistContainer.new
69
- end
70
-
71
- it "should implement enumerable" do
72
- @container.respond_to?(:each).should be_true
73
- @container.class.included_modules.should include(Enumerable)
74
- end
75
- end
76
-
77
- end