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.
@@ -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