hallon 0.2.1 → 0.3.0
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/CHANGELOG +7 -0
- data/QUIRKS +7 -0
- data/README.markdown +3 -0
- data/Rakefile +16 -3
- data/examples/logging_in.rb +3 -11
- data/hallon.gemspec +1 -1
- data/lib/hallon.rb +1 -0
- data/lib/hallon/error.rb +7 -0
- data/lib/hallon/ext/object.rb +4 -1
- data/lib/hallon/linkable.rb +3 -1
- data/lib/hallon/track.rb +120 -0
- data/lib/hallon/version.rb +1 -1
- data/spec/fixtures/example_uris.rb +1 -0
- data/spec/hallon/error_spec.rb +6 -0
- data/spec/hallon/track_spec.rb +89 -0
- metadata +22 -19
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,6 +1,13 @@ | |
| 1 1 | 
             
            Hallon’s Changelog
         | 
| 2 2 | 
             
            ==================
         | 
| 3 3 |  | 
| 4 | 
            +
            v0.3.0
         | 
| 5 | 
            +
            ------------------
         | 
| 6 | 
            +
            - Don’t use bundler for :spec and :test rake tasks
         | 
| 7 | 
            +
            - Add Error.table
         | 
| 8 | 
            +
            - Add Track subsystem
         | 
| 9 | 
            +
            - Fix spec:cov and spotify:coverage rake tasks
         | 
| 10 | 
            +
             | 
| 4 11 | 
             
            v0.2.1
         | 
| 5 12 | 
             
            ------------------
         | 
| 6 13 | 
             
            - Fix compatibility with v1.8
         | 
    
        data/QUIRKS
    CHANGED
    
    | @@ -1,5 +1,9 @@ | |
| 1 1 | 
             
            # Quirks, oddities and general notes about libspotify
         | 
| 2 2 |  | 
| 3 | 
            +
            - HTTP links with track offset (spotify:track:7N2Vc8u56VGA4KUrGbikC2#1:40) don’t
         | 
| 4 | 
            +
              work, even if you URL encode the hash: http://open.spotify.com/track/7N2Vc8u56VGA4KUrGbikC2%231:40
         | 
| 5 | 
            +
              this appears to have worked at least 7 months ago
         | 
| 6 | 
            +
             | 
| 3 7 | 
             
            ## Session
         | 
| 4 8 | 
             
            - `sp_session_release` will segfault (rare)
         | 
| 5 9 | 
             
            - `login` callback fires even if the login fails; instead,
         | 
| @@ -9,3 +13,6 @@ | |
| 9 13 |  | 
| 10 14 | 
             
            ## Link
         | 
| 11 15 | 
             
            - segfaults if created before a session
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            ## Track
         | 
| 18 | 
            +
            - `sp_link_as_track_and_offset` operate in milliseconds, but documentation states seconds
         | 
    
        data/README.markdown
    CHANGED
    
    | @@ -1,5 +1,8 @@ | |
| 1 1 | 
             
            What is Hallon?
         | 
| 2 2 | 
             
            ===============
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            > [Hallon, delicious Ruby bindings for libspotify](http://burgestrand.se/articles/hallon-delicious-ruby-bindings-to-libspotify.html)
         | 
| 5 | 
            +
             | 
| 3 6 | 
             
            We rubyists have this awesome [spotify gem][] allowing us to use [libspotify][] from within Ruby, but it has a significant drawback: the `libspotify` API is very hard to use. Now, we can’t have that, so what do we do? We make Hallon!
         | 
| 4 7 |  | 
| 5 8 | 
             
            Hallon is Swedish for “Raspberry”, and has been written to satisfy my needs for API simplicity. It provides you with a wrapper around the spotify gem, making the experience of using `libspotify` from Ruby much more enjoyable.
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -9,11 +9,12 @@ YARD::Rake::YardocTask.new | |
| 9 9 |  | 
| 10 10 | 
             
            require 'rspec/core/rake_task'
         | 
| 11 11 | 
             
            RSpec::Core::RakeTask.new('spec') do |task|
         | 
| 12 | 
            +
              task.skip_bundler = true
         | 
| 12 13 | 
             
              task.ruby_opts = '-W2'
         | 
| 13 14 | 
             
            end
         | 
| 14 15 |  | 
| 15 16 | 
             
            desc "Run the full test suite and generate a coverage report"
         | 
| 16 | 
            -
            task 'spec:cov' => ['clean', 'spec | 
| 17 | 
            +
            task 'spec:cov' => ['clean', 'spec'] do
         | 
| 17 18 | 
             
              require 'cover_me'
         | 
| 18 19 | 
             
              require './spec/support/cover_me'
         | 
| 19 20 |  | 
| @@ -26,9 +27,21 @@ task 'spotify:coverage' do | |
| 26 27 | 
             
              require 'set'
         | 
| 27 28 | 
             
              require 'spotify'
         | 
| 28 29 |  | 
| 29 | 
            -
               | 
| 30 | 
            +
              dynamicly_used = []
         | 
| 31 | 
            +
              dynamicly_used << "link_create_from_track" # lib/hallon/track.rb
         | 
| 32 | 
            +
              dynamicly_used << "track_add_ref"          # lib/ext/spotify.rb
         | 
| 33 | 
            +
              dynamicly_used << "track_release"          # lib/ext/spotify.rb
         | 
| 34 | 
            +
              dynamicly_used << "link_create_from_image" # lib/hallon/image.rb
         | 
| 35 | 
            +
              dynamicly_used << "image_release"          # lib/ext/spotify.rb
         | 
| 36 | 
            +
              dynamicly_used << "link_create_from_user"  # lib/hallon/user.rb
         | 
| 37 | 
            +
              dynamicly_used << "user_add_ref"           # lib/ext/spotify.rb
         | 
| 38 | 
            +
              dynamicly_used << "user_release"           # lib/ext/spotify.rb
         | 
| 39 | 
            +
              dynamicly_used << "link_as_track"          # IGNORE
         | 
| 40 | 
            +
              dynamicly_used << "link_release"           # lib/ext/spotify.rb
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              methods = Spotify.methods(false).map(&:to_s) - dynamicly_used
         | 
| 30 43 | 
             
              covered = Set.new(methods)
         | 
| 31 | 
            -
              matcher = /Spotify | 
| 44 | 
            +
              matcher = /Spotify(?:::|\.)([\w_]+)[ \(]/
         | 
| 32 45 |  | 
| 33 46 | 
             
              FileList['lib/**/*.rb'].each do |file|
         | 
| 34 47 | 
             
                File.read(file).scan(matcher) { |method, _| covered.delete(method) }
         | 
    
        data/examples/logging_in.rb
    CHANGED
    
    | @@ -9,18 +9,10 @@ session = Hallon::Session.instance IO.read(ENV['HALLON_APPKEY']) do | |
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| 11 11 | 
             
            session.login ENV['HALLON_USERNAME'], ENV['HALLON_PASSWORD']
         | 
| 12 | 
            -
            logged_in  = session.process_events_on(:logged_in) { |error| error }
         | 
| 13 12 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
            conn_error = session.process_events_on(:connection_error) do |error|
         | 
| 19 | 
            -
              session.logged_in? or error
         | 
| 20 | 
            -
            end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            unless conn_error == true
         | 
| 23 | 
            -
              abort "[ERROR] (:connection_error) #{Hallon::Error.explain(conn_error)}"
         | 
| 13 | 
            +
            session.process_events_on(:logged_in) { |error| Hallon::Error.maybe_raise(error) }
         | 
| 14 | 
            +
            session.process_events_on(:connection_error) do |error|
         | 
| 15 | 
            +
              session.logged_in? or Hallon::Error.maybe_raise(error)
         | 
| 24 16 | 
             
            end
         | 
| 25 17 |  | 
| 26 18 | 
             
            puts "Successfully logged in!"
         | 
    
        data/hallon.gemspec
    CHANGED
    
    | @@ -19,7 +19,7 @@ Gem::Specification.new do |gem| | |
| 19 19 | 
             
              gem.required_ruby_version = '~> 1.8'
         | 
| 20 20 |  | 
| 21 21 | 
             
              gem.add_dependency 'spotify', '~> 8.0.5'
         | 
| 22 | 
            -
              gem.add_development_dependency 'mockspotify', '~> 0.1. | 
| 22 | 
            +
              gem.add_development_dependency 'mockspotify', '~> 0.1.7'
         | 
| 23 23 | 
             
              gem.add_development_dependency 'rake', '~> 0.8'
         | 
| 24 24 | 
             
              gem.add_development_dependency 'rspec', '~> 2'
         | 
| 25 25 | 
             
              gem.add_development_dependency 'autotest-standalone'
         | 
    
        data/lib/hallon.rb
    CHANGED
    
    | @@ -14,6 +14,7 @@ require 'hallon/session' | |
| 14 14 | 
             
            require 'hallon/link'
         | 
| 15 15 | 
             
            require 'hallon/user'
         | 
| 16 16 | 
             
            require 'hallon/image'
         | 
| 17 | 
            +
            require 'hallon/track'
         | 
| 17 18 |  | 
| 18 19 | 
             
            # The Hallon module wraps around all Hallon objects to avoid polluting
         | 
| 19 20 | 
             
            # the global namespace. To start using Hallon, you most likely want to
         | 
    
        data/lib/hallon/error.rb
    CHANGED
    
    | @@ -5,6 +5,13 @@ module Hallon | |
| 5 5 | 
             
              # @see http://developer.spotify.com/en/libspotify/docs/group__error.html
         | 
| 6 6 | 
             
              class Error < RuntimeError
         | 
| 7 7 | 
             
                class << self
         | 
| 8 | 
            +
                  # Hash of error (Symbol) to code (Integer).
         | 
| 9 | 
            +
                  #
         | 
| 10 | 
            +
                  # @return [Hash<Symbol, Integer>]
         | 
| 11 | 
            +
                  def table
         | 
| 12 | 
            +
                    Spotify::enum_type(:error).to_hash
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 8 15 | 
             
                  # Given a number or a symbol, find both the symbol and the error
         | 
| 9 16 | 
             
                  # number it represents.
         | 
| 10 17 | 
             
                  #
         | 
    
        data/lib/hallon/ext/object.rb
    CHANGED
    
    | @@ -1,11 +1,14 @@ | |
| 1 | 
            +
            # Extension of Object for Ruby 1.8 compatibility.
         | 
| 1 2 | 
             
            class Object
         | 
| 2 | 
            -
              unless  | 
| 3 | 
            +
              unless method_defined?(:singleton_class)
         | 
| 4 | 
            +
                # Singleton class of object.
         | 
| 3 5 | 
             
                def singleton_class
         | 
| 4 6 | 
             
                  class << self; self; end
         | 
| 5 7 | 
             
                end
         | 
| 6 8 | 
             
              end
         | 
| 7 9 |  | 
| 8 10 | 
             
              unless method_defined?(:define_singleton_method)
         | 
| 11 | 
            +
                # Defines a method on the singleton class of object.
         | 
| 9 12 | 
             
                def define_singleton_method(*args, &b)
         | 
| 10 13 | 
             
                  singleton_class.send(:define_method, *args, &b)
         | 
| 11 14 | 
             
                end
         | 
    
        data/lib/hallon/linkable.rb
    CHANGED
    
    | @@ -44,7 +44,9 @@ module Hallon | |
| 44 44 | 
             
                    Hallon::Link.new(link)
         | 
| 45 45 | 
             
                  end
         | 
| 46 46 |  | 
| 47 | 
            -
                  define_method(:to_link)  | 
| 47 | 
            +
                  define_method(:to_link) do |*args, &block|
         | 
| 48 | 
            +
                    self.class.to_link(@pointer, *args, &block)
         | 
| 49 | 
            +
                  end
         | 
| 48 50 | 
             
                end
         | 
| 49 51 | 
             
              end
         | 
| 50 52 | 
             
            end
         | 
    
        data/lib/hallon/track.rb
    ADDED
    
    | @@ -0,0 +1,120 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
            module Hallon
         | 
| 3 | 
            +
              # Tracks are an essential part to the Spotify service. They
         | 
| 4 | 
            +
              # are browsable entities that can also be played by streaming.
         | 
| 5 | 
            +
              #
         | 
| 6 | 
            +
              # @see http://developer.spotify.com/en/libspotify/docs/group__track.html
         | 
| 7 | 
            +
              class Track
         | 
| 8 | 
            +
                extend Linkable
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                from_link(:track) { |link, ptr| Spotify.link_as_track_and_offset(link, ptr) }
         | 
| 11 | 
            +
                to_link(:track)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                # Create a Link to the current track and offset in seconds.
         | 
| 14 | 
            +
                #
         | 
| 15 | 
            +
                # @param [Float] offset offset into track in seconds
         | 
| 16 | 
            +
                # @return [Hallon::Link]
         | 
| 17 | 
            +
                def to_link(offset = offset)
         | 
| 18 | 
            +
                  self.class.to_link(@pointer, (offset * 1000).to_i)
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                # Offset into track in seconds this track was created with.
         | 
| 22 | 
            +
                #
         | 
| 23 | 
            +
                # @return [Rational]
         | 
| 24 | 
            +
                attr_reader :offset
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                # Underlying Spotify pointer.
         | 
| 27 | 
            +
                #
         | 
| 28 | 
            +
                # @private
         | 
| 29 | 
            +
                # @return [FFI::Pointer]
         | 
| 30 | 
            +
                attr_reader :pointer
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                # Construct a new Track instance.
         | 
| 33 | 
            +
                #
         | 
| 34 | 
            +
                # @param [String, Link, FFI::Pointer] link
         | 
| 35 | 
            +
                def initialize(link)
         | 
| 36 | 
            +
                  FFI::MemoryPointer.new(:int) do |ptr|
         | 
| 37 | 
            +
                    @pointer = Spotify::Pointer.new from_link(link, ptr), :track, true
         | 
| 38 | 
            +
                    @offset  = Rational(ptr.read_int, 1000)
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                # Create a new local track.
         | 
| 43 | 
            +
                #
         | 
| 44 | 
            +
                # @param [String] title
         | 
| 45 | 
            +
                # @param [String] artist
         | 
| 46 | 
            +
                # @param [String] album
         | 
| 47 | 
            +
                # @param [Integer] length
         | 
| 48 | 
            +
                # @return [Track]
         | 
| 49 | 
            +
                def self.local(title, artist, album = nil, length = nil)
         | 
| 50 | 
            +
                  track = Spotify.localtrack_create(artist, title, album || "", length || -1)
         | 
| 51 | 
            +
                  new(track)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                # @note This’ll be an empty string unless the track is loaded.
         | 
| 55 | 
            +
                # @return [String]
         | 
| 56 | 
            +
                def name
         | 
| 57 | 
            +
                  Spotify.track_name(@pointer)
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                # Duration of the track in seconds.
         | 
| 61 | 
            +
                #
         | 
| 62 | 
            +
                # @note This’ll be `0` unless the track is loaded.
         | 
| 63 | 
            +
                # @return [Rational]
         | 
| 64 | 
            +
                def duration
         | 
| 65 | 
            +
                  Rational(Spotify.track_duration(@pointer), 1000)
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                # Track popularity, between 0 and 1.
         | 
| 69 | 
            +
                #
         | 
| 70 | 
            +
                # @note This’ll be `0` unless the track is loaded.
         | 
| 71 | 
            +
                # @return [Rational]
         | 
| 72 | 
            +
                def popularity
         | 
| 73 | 
            +
                  Rational(Spotify.track_popularity(@pointer), 100)
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                # Disc number this track appears in.
         | 
| 77 | 
            +
                #
         | 
| 78 | 
            +
                # @note This function is a bit special. See libspotify docs for details.
         | 
| 79 | 
            +
                def disc
         | 
| 80 | 
            +
                  Spotify.track_disc(@pointer)
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                # Position of track on its’ disc.
         | 
| 84 | 
            +
                #
         | 
| 85 | 
            +
                # @note This function is a bit special. See libspotify docs for details.
         | 
| 86 | 
            +
                def index
         | 
| 87 | 
            +
                  Spotify.track_index(@pointer)
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                # Retrieve track error status.
         | 
| 91 | 
            +
                #
         | 
| 92 | 
            +
                # @return [Symbol]
         | 
| 93 | 
            +
                def status
         | 
| 94 | 
            +
                  Spotify.track_error(@pointer)
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                # True if the track is loaded
         | 
| 98 | 
            +
                #
         | 
| 99 | 
            +
                # @return [Boolean]
         | 
| 100 | 
            +
                def loaded?
         | 
| 101 | 
            +
                  Spotify.track_is_loaded(@pointer)
         | 
| 102 | 
            +
                end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                # Album this track belongs to.
         | 
| 105 | 
            +
                #
         | 
| 106 | 
            +
                # @note This’ll be `nil` unless the track is loaded.
         | 
| 107 | 
            +
                # @return [Hallon::Album]
         | 
| 108 | 
            +
                def album
         | 
| 109 | 
            +
                  album = Spotify.track_album(@pointer)
         | 
| 110 | 
            +
                  Hallon::Album.new(album) unless album.null?
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                # TODO: available?(session)
         | 
| 114 | 
            +
                # TODO: local?(session)
         | 
| 115 | 
            +
                # TODO: autolinked?(session)
         | 
| 116 | 
            +
                # TODO: starred?(session)
         | 
| 117 | 
            +
                # TODO: starred = true (session, array of tracks)
         | 
| 118 | 
            +
                # TODO: artists (count, by index)
         | 
| 119 | 
            +
              end
         | 
| 120 | 
            +
            end
         | 
    
        data/lib/hallon/version.rb
    CHANGED
    
    
    
        data/spec/hallon/error_spec.rb
    CHANGED
    
    
| @@ -0,0 +1,89 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
            describe Hallon::Track, :session => true do
         | 
| 3 | 
            +
              let(:artist) { Spotify.mock_artist("Artist", true) }
         | 
| 4 | 
            +
              let(:album)  { Spotify.mock_album("Album", artist, 2011, nil, :unknown, true, true) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              subject do
         | 
| 7 | 
            +
                artists = FFI::MemoryPointer.new(:pointer)
         | 
| 8 | 
            +
                artists.write_pointer artist
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                track = Spotify.mock_track(
         | 
| 11 | 
            +
                  "Elucteene", # name
         | 
| 12 | 
            +
                  1, artists, # num_artists, artists
         | 
| 13 | 
            +
                  album, # album
         | 
| 14 | 
            +
                  123_456, # duration
         | 
| 15 | 
            +
                  42,  # popularity
         | 
| 16 | 
            +
                  2, 7, # disc, index
         | 
| 17 | 
            +
                  0, true  # error, loaded
         | 
| 18 | 
            +
                )
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                artists.free
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                Hallon::Track.new(track)
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              its(:name)   { should eq "Elucteene" }
         | 
| 26 | 
            +
              its(:disc)   { should be 2 }
         | 
| 27 | 
            +
              its(:index)  { should be 7 }
         | 
| 28 | 
            +
              its(:status) { should be :ok }
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              its(:duration) { should eq 123.456 }
         | 
| 31 | 
            +
              its(:popularity) { should eq 0.42 }
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              xit("artist.name") { should eq "Artist" }
         | 
| 34 | 
            +
              xit("album.name")  { should eq "Album"  }
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              it { should be_loaded }
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              describe "album" do
         | 
| 39 | 
            +
                it "should be an album when there is one" do
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                it "should be nil when there isn’t one" do
         | 
| 44 | 
            +
                  Spotify.should_receive(:track_album).and_return(FFI::Pointer.new(0))
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  subject.album.should be_nil
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              describe "to_link" do
         | 
| 51 | 
            +
                it "should pass the current offset by default" do
         | 
| 52 | 
            +
                  subject.should_receive(:offset).and_return(10)
         | 
| 53 | 
            +
                  described_class.should_receive(:to_link).with(subject.pointer, 10_000)
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  subject.to_link
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                it "should accept offset as parameter" do
         | 
| 59 | 
            +
                  subject.should_not_receive(:offset)
         | 
| 60 | 
            +
                  described_class.should_receive(:to_link).with(subject.pointer, 1_337_000)
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  subject.to_link(1337)
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              describe "offset" do
         | 
| 67 | 
            +
                let(:without_offset) { 'spotify:track:7N2Vc8u56VGA4KUrGbikC2' }
         | 
| 68 | 
            +
                let(:with_offset) { without_offset + '#1:00' }
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                specify "with offset" do
         | 
| 71 | 
            +
                  Hallon::Track.new(with_offset).offset.should eq 60
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                specify "without offset" do
         | 
| 75 | 
            +
                  Hallon::Track.new(without_offset).offset.should eq 0
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              describe "a local track" do
         | 
| 80 | 
            +
                subject do
         | 
| 81 | 
            +
                  Hallon::Track.local "Title", "Artist", "Coolio", 100
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                its(:name) { should eq "Title" }
         | 
| 85 | 
            +
                pending("artist.name") { should eq "Artist" }
         | 
| 86 | 
            +
                pending("album.name") { should eq "Album" }
         | 
| 87 | 
            +
                its(:duration) { should eq 0.1 }
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
            end
         | 
    
        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. | 
| 4 | 
            +
              version: 0.3.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: 2011-07- | 
| 12 | 
            +
            date: 2011-07-25 00:00:00.000000000Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: spotify
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &2161051120 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ~>
         | 
| @@ -21,21 +21,21 @@ dependencies: | |
| 21 21 | 
             
                    version: 8.0.5
         | 
| 22 22 | 
             
              type: :runtime
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *2161051120
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 26 | 
             
              name: mockspotify
         | 
| 27 | 
            -
              requirement: & | 
| 27 | 
            +
              requirement: &2161050620 !ruby/object:Gem::Requirement
         | 
| 28 28 | 
             
                none: false
         | 
| 29 29 | 
             
                requirements:
         | 
| 30 30 | 
             
                - - ~>
         | 
| 31 31 | 
             
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            -
                    version: 0.1. | 
| 32 | 
            +
                    version: 0.1.7
         | 
| 33 33 | 
             
              type: :development
         | 
| 34 34 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements: * | 
| 35 | 
            +
              version_requirements: *2161050620
         | 
| 36 36 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 37 37 | 
             
              name: rake
         | 
| 38 | 
            -
              requirement: & | 
| 38 | 
            +
              requirement: &2161050020 !ruby/object:Gem::Requirement
         | 
| 39 39 | 
             
                none: false
         | 
| 40 40 | 
             
                requirements:
         | 
| 41 41 | 
             
                - - ~>
         | 
| @@ -43,10 +43,10 @@ dependencies: | |
| 43 43 | 
             
                    version: '0.8'
         | 
| 44 44 | 
             
              type: :development
         | 
| 45 45 | 
             
              prerelease: false
         | 
| 46 | 
            -
              version_requirements: * | 
| 46 | 
            +
              version_requirements: *2161050020
         | 
| 47 47 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 48 | 
             
              name: rspec
         | 
| 49 | 
            -
              requirement: & | 
| 49 | 
            +
              requirement: &2161049380 !ruby/object:Gem::Requirement
         | 
| 50 50 | 
             
                none: false
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - ~>
         | 
| @@ -54,10 +54,10 @@ dependencies: | |
| 54 54 | 
             
                    version: '2'
         | 
| 55 55 | 
             
              type: :development
         | 
| 56 56 | 
             
              prerelease: false
         | 
| 57 | 
            -
              version_requirements: * | 
| 57 | 
            +
              version_requirements: *2161049380
         | 
| 58 58 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 59 59 | 
             
              name: autotest-standalone
         | 
| 60 | 
            -
              requirement: & | 
| 60 | 
            +
              requirement: &2161048660 !ruby/object:Gem::Requirement
         | 
| 61 61 | 
             
                none: false
         | 
| 62 62 | 
             
                requirements:
         | 
| 63 63 | 
             
                - - ! '>='
         | 
| @@ -65,10 +65,10 @@ dependencies: | |
| 65 65 | 
             
                    version: '0'
         | 
| 66 66 | 
             
              type: :development
         | 
| 67 67 | 
             
              prerelease: false
         | 
| 68 | 
            -
              version_requirements: * | 
| 68 | 
            +
              version_requirements: *2161048660
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: autotest-growl
         | 
| 71 | 
            -
              requirement: & | 
| 71 | 
            +
              requirement: &2161047680 !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                none: false
         | 
| 73 73 | 
             
                requirements:
         | 
| 74 74 | 
             
                - - ! '>='
         | 
| @@ -76,10 +76,10 @@ dependencies: | |
| 76 76 | 
             
                    version: '0'
         | 
| 77 77 | 
             
              type: :development
         | 
| 78 78 | 
             
              prerelease: false
         | 
| 79 | 
            -
              version_requirements: * | 
| 79 | 
            +
              version_requirements: *2161047680
         | 
| 80 80 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 81 81 | 
             
              name: yard
         | 
| 82 | 
            -
              requirement: & | 
| 82 | 
            +
              requirement: &2161046920 !ruby/object:Gem::Requirement
         | 
| 83 83 | 
             
                none: false
         | 
| 84 84 | 
             
                requirements:
         | 
| 85 85 | 
             
                - - ! '>='
         | 
| @@ -87,10 +87,10 @@ dependencies: | |
| 87 87 | 
             
                    version: '0'
         | 
| 88 88 | 
             
              type: :development
         | 
| 89 89 | 
             
              prerelease: false
         | 
| 90 | 
            -
              version_requirements: * | 
| 90 | 
            +
              version_requirements: *2161046920
         | 
| 91 91 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 92 92 | 
             
              name: rdiscount
         | 
| 93 | 
            -
              requirement: & | 
| 93 | 
            +
              requirement: &2161044780 !ruby/object:Gem::Requirement
         | 
| 94 94 | 
             
                none: false
         | 
| 95 95 | 
             
                requirements:
         | 
| 96 96 | 
             
                - - ! '>='
         | 
| @@ -98,7 +98,7 @@ dependencies: | |
| 98 98 | 
             
                    version: '0'
         | 
| 99 99 | 
             
              type: :development
         | 
| 100 100 | 
             
              prerelease: false
         | 
| 101 | 
            -
              version_requirements: * | 
| 101 | 
            +
              version_requirements: *2161044780
         | 
| 102 102 | 
             
            description: 
         | 
| 103 103 | 
             
            email: kim@burgestrand.se
         | 
| 104 104 | 
             
            executables: []
         | 
| @@ -131,6 +131,7 @@ files: | |
| 131 131 | 
             
            - lib/hallon/observable.rb
         | 
| 132 132 | 
             
            - lib/hallon/session.rb
         | 
| 133 133 | 
             
            - lib/hallon/synchronizable.rb
         | 
| 134 | 
            +
            - lib/hallon/track.rb
         | 
| 134 135 | 
             
            - lib/hallon/user.rb
         | 
| 135 136 | 
             
            - lib/hallon/version.rb
         | 
| 136 137 | 
             
            - spec/fixtures/example_uris.rb
         | 
| @@ -144,6 +145,7 @@ files: | |
| 144 145 | 
             
            - spec/hallon/observable_spec.rb
         | 
| 145 146 | 
             
            - spec/hallon/session_spec.rb
         | 
| 146 147 | 
             
            - spec/hallon/synchronizable_spec.rb
         | 
| 148 | 
            +
            - spec/hallon/track_spec.rb
         | 
| 147 149 | 
             
            - spec/hallon/user_spec.rb
         | 
| 148 150 | 
             
            - spec/spec_helper.rb
         | 
| 149 151 | 
             
            - spec/support/.gitkeep
         | 
| @@ -187,6 +189,7 @@ test_files: | |
| 187 189 | 
             
            - spec/hallon/observable_spec.rb
         | 
| 188 190 | 
             
            - spec/hallon/session_spec.rb
         | 
| 189 191 | 
             
            - spec/hallon/synchronizable_spec.rb
         | 
| 192 | 
            +
            - spec/hallon/track_spec.rb
         | 
| 190 193 | 
             
            - spec/hallon/user_spec.rb
         | 
| 191 194 | 
             
            - spec/spec_helper.rb
         | 
| 192 195 | 
             
            - spec/support/.gitkeep
         |