sync_songs 0.0.1

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