sync_songs 0.0.1
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 +8 -0
- data/CONTRIBUTING.org +14 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +51 -0
- data/LICENSE.org +2 -0
- data/README.org +117 -0
- data/Rakefile +19 -0
- data/bin/sync_songs +69 -0
- data/development.org +53 -0
- data/lib/sync_songs/cli.rb +280 -0
- data/lib/sync_songs/controller.rb +435 -0
- data/lib/sync_songs/services/csv_cli.rb +26 -0
- data/lib/sync_songs/services/csv_controller.rb +64 -0
- data/lib/sync_songs/services/csv_set.rb +65 -0
- data/lib/sync_songs/services/grooveshark_cli.rb +26 -0
- data/lib/sync_songs/services/grooveshark_controller.rb +77 -0
- data/lib/sync_songs/services/grooveshark_set.rb +107 -0
- data/lib/sync_songs/services/lastfm_cli.rb +46 -0
- data/lib/sync_songs/services/lastfm_controller.rb +78 -0
- data/lib/sync_songs/services/lastfm_set.rb +177 -0
- data/lib/sync_songs/services/service_controller.rb +55 -0
- data/lib/sync_songs/song.rb +99 -0
- data/lib/sync_songs/song_set.rb +30 -0
- data/lib/sync_songs/version.rb +6 -0
- data/lib/sync_songs.rb +27 -0
- data/plan.org +17 -0
- data/sync_songs.gemspec +25 -0
- data/test/unit/sample_data/sample_data.rb +23 -0
- data/test/unit/services/test_csv_set.rb +54 -0
- data/test/unit/services/test_service_controller.rb +30 -0
- data/test/unit/suite_data.rb +12 -0
- data/test/unit/test_song.rb +129 -0
- data/test/unit/test_song_set.rb +134 -0
- metadata +165 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require_relative '../../../lib/sync_songs/song'
|
4
|
+
|
5
|
+
# Public: Classes for syncing sets of songs.
|
6
|
+
module SyncSongs
|
7
|
+
# Internal: Data for tests. DO NOT CHANGE unless you want to change
|
8
|
+
# the meaning of many tests.
|
9
|
+
module SampleData
|
10
|
+
def setupTestSongs
|
11
|
+
@songs = [Song.new('Name1 ' , ' Artist1'), # 0
|
12
|
+
Song.new(' Name2 ' , ' Artist2 '), # 1
|
13
|
+
Song.new(' Name2 ', ' Artist1 '), # 2
|
14
|
+
Song.new('Name1' , 'Artist2'), # 3
|
15
|
+
Song.new(' Name1 ' , 'Artist1'), # 4
|
16
|
+
Song.new(' Name2 ' , 'Artist2'), # 5
|
17
|
+
Song.new('Name' , ' artist'), # 6
|
18
|
+
Song.new(' name ', 'Artist '), # 7
|
19
|
+
Song.new('Some name', 'An Artist', # 8
|
20
|
+
'The Album', 330, 'qwerty')]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require_relative '../../../lib/sync_songs/services/csv_set'
|
5
|
+
require_relative '../sample_data/sample_data'
|
6
|
+
|
7
|
+
# Public: Classes for syncing sets of songs.
|
8
|
+
module SyncSongs
|
9
|
+
# Internal: Unit test for the class CsvSet.
|
10
|
+
class TestCsvSet < Test::Unit::TestCase
|
11
|
+
include SampleData
|
12
|
+
|
13
|
+
# Internal: Setup CsvSets.
|
14
|
+
def setup
|
15
|
+
setupTestSongs
|
16
|
+
@file_names = []
|
17
|
+
1.upto(2) do |i|
|
18
|
+
@file_names << 'test/unit/services/sample_data/'\
|
19
|
+
"test_csv_set_sample#{i}.csv"
|
20
|
+
end
|
21
|
+
|
22
|
+
@sets = []
|
23
|
+
@file_names.each { |n| @sets << CsvSet.new(n) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_simple
|
27
|
+
# Add some songs to CSV files
|
28
|
+
@sets[0].addToLibrary(SongSet.new(@songs[0], @songs[8]))
|
29
|
+
@sets[1].addToLibrary(SongSet.new(@songs[0], @songs[7]))
|
30
|
+
|
31
|
+
assert(File.exists?(@file_names[0]), 'Should create a file')
|
32
|
+
|
33
|
+
# Then get data from them.
|
34
|
+
@lib = []
|
35
|
+
@sets.each { |s| @lib << s.library }
|
36
|
+
|
37
|
+
# Should work as expected.
|
38
|
+
assert(@lib[0].member?(@songs[0]),
|
39
|
+
'Reading from CSV should not corrupt data')
|
40
|
+
assert(@lib[0].member?(@songs[8]),
|
41
|
+
'Reading from CSV should not corrupt data')
|
42
|
+
@lib.each do |l|
|
43
|
+
assert_not_nil(l, 'Should read something from CSV')
|
44
|
+
assert_equal(l, l.search(l),
|
45
|
+
'Search should simply return what is searched for')
|
46
|
+
end
|
47
|
+
|
48
|
+
ex_to_l0 = @lib[0].exclusiveTo(@lib[1])
|
49
|
+
exl_msg = 'exclusiveTo works as expected'
|
50
|
+
assert(ex_to_l0.size == 1, exl_msg)
|
51
|
+
assert_equal(ex_to_l0, Set.new([@songs[7]]), exl_msg)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require_relative '../../../lib/sync_songs/controller'
|
5
|
+
require_relative '../../../lib/sync_songs/cli'
|
6
|
+
require_relative '../../../lib/sync_songs/services/service_controller'
|
7
|
+
|
8
|
+
# Public: Classes for syncing sets of songs.
|
9
|
+
module SyncSongs
|
10
|
+
# Internal: Unit test for the class ServiceController.
|
11
|
+
class TestLastfmSet < Test::Unit::TestCase
|
12
|
+
|
13
|
+
def test_simple
|
14
|
+
c = Controller.new(CLI.new())
|
15
|
+
ca = [ServiceController.new(c, 'user', 'name', 'type'),
|
16
|
+
ServiceController.new(c, 'USER', 'NAME', 'TYPE')]
|
17
|
+
|
18
|
+
eql_msg = 'Service controllers with the same user, name and '\
|
19
|
+
'type are equal'
|
20
|
+
assert(ca[0].eql?(ca[1]))
|
21
|
+
assert(ca[1].eql?(ca[0]))
|
22
|
+
|
23
|
+
cs = Set.new(ca)
|
24
|
+
|
25
|
+
assert_equal(cs.size, 1, 'There cannot be several service '\
|
26
|
+
'controllers with the same user, name and type '\
|
27
|
+
'in a Set are equalService controller')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Test suite for data classes.
|
4
|
+
require 'test/unit'
|
5
|
+
require_relative 'test_song'
|
6
|
+
require_relative 'test_song_set'
|
7
|
+
require_relative './services/test_service_controller'
|
8
|
+
require_relative './services/test_csv_set'
|
9
|
+
|
10
|
+
# The following tests takes too long time to be included in the suit.
|
11
|
+
# require_relative './services/test_grooveshark_set'
|
12
|
+
# require_relative './services/test_lastfm_set'
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require_relative 'sample_data/sample_data'
|
5
|
+
|
6
|
+
# Public: Classes for syncing sets of songs.
|
7
|
+
module SyncSongs
|
8
|
+
# Internal: Unit test for the class Song.
|
9
|
+
class TestSong < Test::Unit::TestCase
|
10
|
+
include SampleData
|
11
|
+
|
12
|
+
def setup
|
13
|
+
setupTestSongs
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_simple
|
17
|
+
init_msg = 'Songs should initialize'
|
18
|
+
assert_not_nil(@songs[0], init_msg)
|
19
|
+
assert_not_nil(@songs[1], init_msg)
|
20
|
+
|
21
|
+
assert_raise(ArgumentError) { @songs << Song.new('' , 'Name') }
|
22
|
+
assert_raise(ArgumentError) { @songs << Song.new('Artist' , '') }
|
23
|
+
assert_raise(ArgumentError) { @songs << Song.new(' ' , ' ') }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_strip
|
27
|
+
lead_trail_ws = /(^\s+)|(\s+$)/
|
28
|
+
strip_msg = 'Songs should be stripped from leading and '\
|
29
|
+
'trailing whitespace'
|
30
|
+
@songs.each do |song|
|
31
|
+
assert_nil(lead_trail_ws.match(song.name), strip_msg)
|
32
|
+
assert_nil(lead_trail_ws.match(song.artist), strip_msg)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_getters
|
37
|
+
getter_msg = 'Getters should return an unchanged value'
|
38
|
+
assert_equal(@songs[0].artist, 'Artist1', getter_msg)
|
39
|
+
assert_equal(@songs[1].artist, 'Artist2', getter_msg)
|
40
|
+
assert_not_equal(@songs[0].artist, 'Artist2', getter_msg)
|
41
|
+
assert_not_equal(@songs[1].artist, 'Artist1', getter_msg)
|
42
|
+
|
43
|
+
assert_equal(@songs[0].name, 'Name1', getter_msg)
|
44
|
+
assert_equal(@songs[1].name, 'Name2', getter_msg)
|
45
|
+
assert_not_equal(@songs[0].name, 'Name2', getter_msg)
|
46
|
+
assert_not_equal(@songs[1].name, 'Name1', getter_msg)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_spaceship
|
50
|
+
spaceship_msg = 'The spaceship works as expected'
|
51
|
+
assert_equal(@songs[0] <=> @songs[1], -1, spaceship_msg)
|
52
|
+
assert_equal(@songs[1] <=> @songs[0], 1, spaceship_msg)
|
53
|
+
assert_equal(@songs[1] <=> @songs[2], 1, spaceship_msg)
|
54
|
+
assert_equal(@songs[4] <=> @songs[3], -1, spaceship_msg)
|
55
|
+
assert_equal(@songs[0] <=> @songs[4], 0, spaceship_msg)
|
56
|
+
assert_equal(@songs[1] <=> @songs[5], 0, spaceship_msg)
|
57
|
+
assert_equal(@songs[6] <=> @songs[7], 0, spaceship_msg)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_comparison_operators
|
61
|
+
comparison_msg = 'Comparison operators works as expected'
|
62
|
+
assert(@songs[0] < @songs[1], comparison_msg)
|
63
|
+
assert(@songs[1] > @songs[0], comparison_msg)
|
64
|
+
assert(@songs[1] > @songs[2], comparison_msg)
|
65
|
+
assert(@songs[0] < @songs[3], comparison_msg)
|
66
|
+
assert(@songs[4] <= @songs[5], comparison_msg)
|
67
|
+
assert(@songs[6] <= @songs[7], comparison_msg)
|
68
|
+
assert(@songs[6] == @songs[7], comparison_msg)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_eql?
|
72
|
+
identity_msg = 'Songs should be self-identical'
|
73
|
+
assert(@songs[0].eql?(@songs[0]), identity_msg)
|
74
|
+
assert(@songs[1].eql?(@songs[1]), identity_msg)
|
75
|
+
|
76
|
+
assert(!@songs[0].eql?(@songs[1]) && !@songs[1].eql?(@songs[0]),
|
77
|
+
'Non-equality for songs is symmetrical')
|
78
|
+
|
79
|
+
both_fields_equality_msg = 'Only the fields name and artist '\
|
80
|
+
'affect equality'
|
81
|
+
assert(!@songs[1].eql?(@songs[2]), both_fields_equality_msg)
|
82
|
+
assert(!@songs[2].eql?(@songs[3]), both_fields_equality_msg)
|
83
|
+
assert(!@songs[3].eql?(@songs[4]), both_fields_equality_msg)
|
84
|
+
assert(!@songs[4].eql?(@songs[5]), both_fields_equality_msg)
|
85
|
+
|
86
|
+
spaces_not_significant_msg = 'Spaces are not significant for equality'
|
87
|
+
assert(@songs[0].eql?(@songs[4]), spaces_not_significant_msg)
|
88
|
+
assert(@songs[1].eql?(@songs[5]), spaces_not_significant_msg)
|
89
|
+
|
90
|
+
assert(@songs[6].eql?(@songs[7]), 'Case should not matter for equality')
|
91
|
+
|
92
|
+
sanity_msg = 'Assumptions about test data should be correct'
|
93
|
+
assert_not_equal(@songs[1], @songs[2], sanity_msg)
|
94
|
+
assert_not_equal(@songs[2], @songs[3], sanity_msg)
|
95
|
+
assert_not_equal(@songs[3], @songs[4], sanity_msg)
|
96
|
+
assert_not_equal(@songs[4], @songs[5], sanity_msg)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_include?
|
100
|
+
identical_msg = 'Identical songs includes each others'
|
101
|
+
assert(@songs[0].include?(@songs[4]), identical_msg)
|
102
|
+
assert(@songs[4].include?(@songs[0]), identical_msg)
|
103
|
+
assert(@songs[1].include?(@songs[5]), identical_msg)
|
104
|
+
assert(@songs[5].include?(@songs[1]), identical_msg)
|
105
|
+
|
106
|
+
case_msg = 'include? works as expected and is not sensitive to case'
|
107
|
+
assert(@songs[2].include?(@songs[6]), case_msg)
|
108
|
+
assert(@songs[2].include?(@songs[7]), case_msg)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_similar?
|
112
|
+
similar_msg = 'similar? is like reflexive include'
|
113
|
+
assert(@songs[0].similar?(@songs[6]), similar_msg)
|
114
|
+
assert(@songs[6].similar?(@songs[0]), similar_msg)
|
115
|
+
assert(@songs[3].similar?(@songs[7]), similar_msg)
|
116
|
+
assert(@songs[7].similar?(@songs[3]), similar_msg)
|
117
|
+
end
|
118
|
+
|
119
|
+
def to_search_term
|
120
|
+
assert_equal(@songs[0].to_search_term, 'name1 artist1',
|
121
|
+
'Search term is in correct form')
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_to_s
|
125
|
+
assert_equal(@songs[0].to_s, 'Artist1 - Name1',
|
126
|
+
'String is in correct form')
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require_relative '../../lib/sync_songs/song_set'
|
5
|
+
require_relative 'sample_data/sample_data'
|
6
|
+
|
7
|
+
# Public: Classes for syncing sets of songs.
|
8
|
+
module SyncSongs
|
9
|
+
# Private: Unit test for the class SongSet.
|
10
|
+
class TestSongSet < Test::Unit::TestCase
|
11
|
+
include SampleData
|
12
|
+
|
13
|
+
def setup
|
14
|
+
setupTestSongs
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_size
|
18
|
+
set = SongSet.new
|
19
|
+
set << @songs[0]
|
20
|
+
|
21
|
+
size_msg = 'Should return set\'s size'
|
22
|
+
assert(set.size == 1, size_msg)
|
23
|
+
assert(set.length == 1, size_msg)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_simple
|
27
|
+
sets = [SongSet.new, SongSet.new]
|
28
|
+
|
29
|
+
init_msg = 'Song sets should initialize'
|
30
|
+
assert_not_nil(sets[0], init_msg)
|
31
|
+
assert_not_nil(sets[1], init_msg)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_add
|
35
|
+
# add is used by the constructor of SongSet
|
36
|
+
sets = [SongSet.new(@songs[0]), SongSet.new(@songs[0])]
|
37
|
+
|
38
|
+
add_msg = 'A song set should not manipulate its content'
|
39
|
+
assert_equal(@songs[0], sets[0].first, add_msg)
|
40
|
+
assert_equal(@songs[0], sets[1].first, add_msg)
|
41
|
+
assert(sets[0].member?(@songs[0]), add_msg)
|
42
|
+
assert(sets[1].member?(@songs[0]), add_msg)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_add?
|
46
|
+
addq_msg = 'add? works as expected'
|
47
|
+
set = SongSet.new
|
48
|
+
set.add?(@songs[0])
|
49
|
+
assert_equal(set.add?(@songs[0]), nil, addq_msg)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_difference
|
53
|
+
sets = [SongSet.new(@songs[0]), SongSet.new(@songs[0])]
|
54
|
+
|
55
|
+
diff_eql_msg = 'There is no difference between sets with the '\
|
56
|
+
'same members'
|
57
|
+
assert(sets[0].difference(sets[1]).empty?, diff_eql_msg)
|
58
|
+
assert(sets[1].difference(sets[0]).empty?, diff_eql_msg)
|
59
|
+
|
60
|
+
sets[0].add(@songs[1]) # sets[0] = {@songs[0], @songs[1]}
|
61
|
+
sets[1].add(@songs[2]) # sets[1] = {@songs[0], @songs[2]}
|
62
|
+
assert(!(sets[0] - sets[1]).member?(@songs[0]),
|
63
|
+
'The difference is not the shared element')
|
64
|
+
|
65
|
+
diff_msg = 'The difference is the non-shared element in the receiver'
|
66
|
+
assert((sets[0] - sets[1]).member?(@songs[1]), diff_msg)
|
67
|
+
assert((sets[1] - sets[0]).member?(@songs[2]), diff_msg)
|
68
|
+
sets[0].add(@songs[2]) # sets[0] = {@songs[0], @songs[1], @songs[2]}
|
69
|
+
assert((sets[0] - sets[1]).member?(@songs[1]), diff_msg)
|
70
|
+
assert((sets[1] - sets[0]).empty?, diff_msg)
|
71
|
+
|
72
|
+
sets[2] = SongSet.new(@songs[0], @songs[1], @songs[2])
|
73
|
+
sets[3] = SongSet.new(@songs[2], @songs[0], @songs[1])
|
74
|
+
assert((sets[2] - sets[3]).empty?,
|
75
|
+
'There is no difference between sets with the same '\
|
76
|
+
'members that has been added in different order')
|
77
|
+
assert((sets[2] - sets[3]).empty?,
|
78
|
+
'The alias - for difference should work')
|
79
|
+
|
80
|
+
sets[2].add(@songs[0])
|
81
|
+
sets[3].add(@songs[2])
|
82
|
+
assert((sets[2] - sets[3]).empty?, 'There are no duplicate entries')
|
83
|
+
|
84
|
+
sets[2].add(@songs[6])
|
85
|
+
sets[3].add(@songs[7])
|
86
|
+
assert((sets[2] - sets[3]).empty?,
|
87
|
+
'Case should not matter for the difference')
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_empty?
|
91
|
+
empty_msg = 'empty? works as expected'
|
92
|
+
set = SongSet.new()
|
93
|
+
assert(set.empty?, empty_msg)
|
94
|
+
set << @songs[0]
|
95
|
+
assert(!set.empty?, empty_msg)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_exclusiveTo
|
99
|
+
sets = [SongSet.new(@songs[0], @songs[1]),
|
100
|
+
SongSet.new(@songs[1], @songs[2])]
|
101
|
+
|
102
|
+
exclusiveTo_msg = 'The songs to add are those that are in the '\
|
103
|
+
'given set but not in this set'
|
104
|
+
assert(sets[0].exclusiveTo(sets[1]).first.eql?(@songs[2]),
|
105
|
+
exclusiveTo_msg)
|
106
|
+
assert(sets[1].exclusiveTo(sets[0]).first.eql?(@songs[0]),
|
107
|
+
exclusiveTo_msg)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_inspect
|
111
|
+
sets = [SongSet.new, SongSet.new(@songs[0], @songs[1])]
|
112
|
+
|
113
|
+
# There should be a working inspect method.
|
114
|
+
assert_nothing_raised do
|
115
|
+
sets.each { |set| set.inspect }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_clear
|
120
|
+
set = SongSet.new
|
121
|
+
@songs.each { |song| set << song }
|
122
|
+
|
123
|
+
assert(set.clear.empty?, 'Set should be empty after being cleared')
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_to_a
|
127
|
+
to_a_msg = 'to_a works as expected'
|
128
|
+
set = SongSet.new(@songs[0], @songs[1])
|
129
|
+
set = set.to_a
|
130
|
+
assert_equal(set.class, Array, to_a_msg)
|
131
|
+
assert_equal(set[0], @songs[0], to_a_msg)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sync_songs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sleft
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-30 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: grooveshark
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.2.7
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.2.7
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: highline
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.6.16
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.6.16
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: lastfm
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.17.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.17.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: launchy
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.2.0
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.2.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: thor
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.18.1
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.18.1
|
94
|
+
description: Sync sets of songs
|
95
|
+
email:
|
96
|
+
- fte08eas@student.lu.se
|
97
|
+
executables:
|
98
|
+
- sync_songs
|
99
|
+
extensions: []
|
100
|
+
extra_rdoc_files: []
|
101
|
+
files:
|
102
|
+
- .gitignore
|
103
|
+
- CONTRIBUTING.org
|
104
|
+
- Gemfile
|
105
|
+
- Gemfile.lock
|
106
|
+
- LICENSE.org
|
107
|
+
- README.org
|
108
|
+
- Rakefile
|
109
|
+
- bin/sync_songs
|
110
|
+
- development.org
|
111
|
+
- lib/sync_songs.rb
|
112
|
+
- lib/sync_songs/cli.rb
|
113
|
+
- lib/sync_songs/controller.rb
|
114
|
+
- lib/sync_songs/services/csv_cli.rb
|
115
|
+
- lib/sync_songs/services/csv_controller.rb
|
116
|
+
- lib/sync_songs/services/csv_set.rb
|
117
|
+
- lib/sync_songs/services/grooveshark_cli.rb
|
118
|
+
- lib/sync_songs/services/grooveshark_controller.rb
|
119
|
+
- lib/sync_songs/services/grooveshark_set.rb
|
120
|
+
- lib/sync_songs/services/lastfm_cli.rb
|
121
|
+
- lib/sync_songs/services/lastfm_controller.rb
|
122
|
+
- lib/sync_songs/services/lastfm_set.rb
|
123
|
+
- lib/sync_songs/services/service_controller.rb
|
124
|
+
- lib/sync_songs/song.rb
|
125
|
+
- lib/sync_songs/song_set.rb
|
126
|
+
- lib/sync_songs/version.rb
|
127
|
+
- plan.org
|
128
|
+
- sync_songs.gemspec
|
129
|
+
- test/unit/sample_data/sample_data.rb
|
130
|
+
- test/unit/services/test_csv_set.rb
|
131
|
+
- test/unit/services/test_service_controller.rb
|
132
|
+
- test/unit/suite_data.rb
|
133
|
+
- test/unit/test_song.rb
|
134
|
+
- test/unit/test_song_set.rb
|
135
|
+
homepage: https://github.com/Sleft/sync_songs
|
136
|
+
licenses: []
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
require_paths:
|
140
|
+
- lib
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
none: false
|
143
|
+
requirements:
|
144
|
+
- - ! '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
none: false
|
149
|
+
requirements:
|
150
|
+
- - ! '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
requirements: []
|
154
|
+
rubyforge_project:
|
155
|
+
rubygems_version: 1.8.23
|
156
|
+
signing_key:
|
157
|
+
specification_version: 3
|
158
|
+
summary: SyncSongs
|
159
|
+
test_files:
|
160
|
+
- test/unit/sample_data/sample_data.rb
|
161
|
+
- test/unit/services/test_csv_set.rb
|
162
|
+
- test/unit/services/test_service_controller.rb
|
163
|
+
- test/unit/suite_data.rb
|
164
|
+
- test/unit/test_song.rb
|
165
|
+
- test/unit/test_song_set.rb
|