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