rmd 0.0.1 → 0.1.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.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/Gemfile +1 -0
- data/README.md +7 -2
- data/Rakefile +8 -0
- data/fixtures/vcr_cassettes/nhaccuatui_playlist.yml +124306 -0
- data/fixtures/vcr_cassettes/nhaccuatui_song.yml +32531 -0
- data/fixtures/vcr_cassettes/utils_correct_url_correct.yml +40 -0
- data/fixtures/vcr_cassettes/utils_correct_url_redirect.yml +41 -0
- data/fixtures/vcr_cassettes/zing_playlist.yml +69275 -0
- data/fixtures/vcr_cassettes/zing_song.yml +33334 -0
- data/lib/rmd/base/playlist.rb +52 -0
- data/lib/rmd/base/song.rb +17 -0
- data/lib/rmd/downloader.rb +10 -1
- data/lib/rmd/factory.rb +11 -0
- data/lib/rmd/nct/getter/key_from_page.rb +5 -1
- data/lib/rmd/nct/playlist.rb +9 -46
- data/lib/rmd/nct/song.rb +2 -10
- data/lib/rmd/version.rb +1 -1
- data/lib/rmd/zing/playlist.rb +21 -0
- data/lib/rmd/zing/song.rb +45 -0
- data/lib/rmd/zing/utils/correct_url.rb +43 -0
- data/rmd.gemspec +1 -0
- data/spec/acceptants/main_spec.rb +37 -0
- data/spec/rmd/downloader_spec.rb +16 -10
- data/spec/rmd/factory_spec.rb +37 -4
- data/spec/rmd/nct/playlist_spec.rb +5 -59
- data/spec/rmd/nct/song_spec.rb +1 -1
- data/spec/rmd/zing/playlist_spec.rb +44 -0
- data/spec/rmd/zing/song_spec.rb +92 -0
- data/spec/rmd/zing/utils/correct_url_spec.rb +28 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/download_share_examples.rb +9 -0
- data/spec/support/playlist_share_examples.rb +58 -0
- metadata +40 -2
data/spec/rmd/factory_spec.rb
CHANGED
@@ -14,18 +14,51 @@ describe RMD::Factory do
|
|
14
14
|
|
15
15
|
describe '#build' do
|
16
16
|
let(:factory) { described_class.new(link) }
|
17
|
-
subject { factory.build }
|
17
|
+
subject(:result) { factory.build }
|
18
18
|
|
19
19
|
context 'when link belongs to nhaccuatui website' do
|
20
20
|
context 'when link is song link' do
|
21
|
-
let(:link) { 'www.nhaccuatui/bai-hat/song.mp3' }
|
22
|
-
|
21
|
+
let(:link) { 'www.nhaccuatui.com/bai-hat/song.mp3' }
|
22
|
+
|
23
|
+
it 'returns an adapter' do
|
24
|
+
expect(result).to be_a RMD::SongPlaylistAdapter
|
25
|
+
expect(result.song).to be_a RMD::NCT::Song
|
26
|
+
end
|
23
27
|
end
|
24
28
|
|
25
29
|
context 'when link is playlist link' do
|
26
|
-
let(:link) { 'www.nhaccuatui/playlist/bang-kieu' }
|
30
|
+
let(:link) { 'www.nhaccuatui.com/playlist/bang-kieu' }
|
27
31
|
it { is_expected.to be_a(RMD::NCT::Playlist) }
|
28
32
|
end
|
29
33
|
end
|
34
|
+
|
35
|
+
context 'when link belongs to zing website' do
|
36
|
+
context 'when link is song link' do
|
37
|
+
let(:link) { 'mp3.zing.vn/bai-hat/song.mp3' }
|
38
|
+
|
39
|
+
it 'returns an adapter' do
|
40
|
+
expect(result).to be_a RMD::SongPlaylistAdapter
|
41
|
+
expect(result.song).to be_a RMD::Zing::Song
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when link is playlist link' do
|
46
|
+
let(:link) { 'mp3.zing.vn/playlist/bang-kieu' }
|
47
|
+
it { is_expected.to be_a(RMD::Zing::Playlist) }
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when link is playlist link' do
|
51
|
+
let(:link) { 'mp3.zing.vn/album/bang-kieu' }
|
52
|
+
it { is_expected.to be_a(RMD::Zing::Playlist) }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'otherwise' do
|
57
|
+
let(:link) { '' }
|
58
|
+
|
59
|
+
it 'raises errors' do
|
60
|
+
expect { factory.build }.to raise_error
|
61
|
+
end
|
62
|
+
end
|
30
63
|
end
|
31
64
|
end
|
@@ -2,7 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe RMD::NCT::Playlist do
|
4
4
|
let(:playlist) { described_class.new(link) }
|
5
|
-
let(:link) { 'www.nhaccuatui/bai-hat/playlist.mp3' }
|
5
|
+
let(:link) { 'www.nhaccuatui.com/bai-hat/playlist.mp3' }
|
6
|
+
let(:element_css) { '.item_content .name_song' }
|
7
|
+
|
8
|
+
it_behaves_like 'RMD::Base::Playlist'
|
6
9
|
|
7
10
|
describe '#fetch' do
|
8
11
|
before do
|
@@ -24,7 +27,7 @@ describe RMD::NCT::Playlist do
|
|
24
27
|
end
|
25
28
|
|
26
29
|
it 'fetchs all the song from the playlist' do
|
27
|
-
playlist.fetch
|
30
|
+
capture_io { playlist.fetch }
|
28
31
|
expect(playlist.songs).to eq [song_link]
|
29
32
|
expect(playlist.errors).to eq [errors]
|
30
33
|
end
|
@@ -40,61 +43,4 @@ describe RMD::NCT::Playlist do
|
|
40
43
|
end
|
41
44
|
end
|
42
45
|
end
|
43
|
-
|
44
|
-
describe '#success?' do
|
45
|
-
subject { playlist.success? }
|
46
|
-
|
47
|
-
before do
|
48
|
-
allow(playlist).to receive(:songs).and_return(songs)
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'when songs is nil' do
|
52
|
-
let(:songs) { nil }
|
53
|
-
it { is_expected.to eq false }
|
54
|
-
end
|
55
|
-
|
56
|
-
context 'when songs is blank' do
|
57
|
-
let(:songs) { [] }
|
58
|
-
it { is_expected.to eq false }
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'otherwise' do
|
62
|
-
let(:songs) { ['songs'] }
|
63
|
-
it { is_expected.to eq true }
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe '#song_elements' do
|
68
|
-
let(:page) { double('Page') }
|
69
|
-
let(:song_element) { double('playlistElement') }
|
70
|
-
let(:song_elements) { [song_element] }
|
71
|
-
subject { playlist.send(:song_elements) }
|
72
|
-
|
73
|
-
before do
|
74
|
-
expect(playlist).to receive(:page).and_return(page)
|
75
|
-
expect(page).to receive(:search) .with('.item_content .name_song')
|
76
|
-
.and_return(song_elements)
|
77
|
-
end
|
78
|
-
|
79
|
-
it { is_expected.to eq song_elements }
|
80
|
-
end
|
81
|
-
|
82
|
-
describe '#page' do
|
83
|
-
let(:agent) { instance_double('Mechanize') }
|
84
|
-
let(:page) { double('Page') }
|
85
|
-
subject { playlist.send(:page) }
|
86
|
-
|
87
|
-
before do
|
88
|
-
expect(playlist).to receive(:agent).and_return(agent)
|
89
|
-
expect(agent).to receive(:get).with(link).and_return(page)
|
90
|
-
end
|
91
|
-
|
92
|
-
it { is_expected.to eq page }
|
93
|
-
end
|
94
|
-
|
95
|
-
describe '#agent' do
|
96
|
-
it 'creates agent' do
|
97
|
-
expect(playlist.send(:agent)).to be_a(Mechanize)
|
98
|
-
end
|
99
|
-
end
|
100
46
|
end
|
data/spec/rmd/nct/song_spec.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RMD::Zing::Playlist do
|
4
|
+
let(:playlist) { described_class.new(link) }
|
5
|
+
let(:link) { 'mp3.zing.vn/bai-hat/playlist.mp3' }
|
6
|
+
let(:element_css) { '._btnDownload' }
|
7
|
+
|
8
|
+
it_behaves_like 'RMD::Base::Playlist'
|
9
|
+
|
10
|
+
describe '#fetch' do
|
11
|
+
before do
|
12
|
+
allow(playlist).to receive(:song_elements)
|
13
|
+
.and_return(song_elements)
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when there are song elements' do
|
17
|
+
let(:element) { double('Element') }
|
18
|
+
let(:errors) { 'errors' }
|
19
|
+
let(:song_link) { 'song_link' }
|
20
|
+
let(:song_elements) { [element] }
|
21
|
+
|
22
|
+
before do
|
23
|
+
expect(element).to receive(:attr).with('href').and_return(link)
|
24
|
+
expect(RMD::Zing::Utils::CorrectUrl).to receive(:correct).with(link).and_return(song_link)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'fetchs all the song from the playlist' do
|
28
|
+
capture_io { playlist.fetch }
|
29
|
+
expect(playlist.songs).to eq [song_link]
|
30
|
+
expect(playlist.errors).to eq []
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when there are no song elements' do
|
35
|
+
let(:song_elements) { [] }
|
36
|
+
|
37
|
+
it 'does not do anything' do
|
38
|
+
playlist.fetch
|
39
|
+
expect(playlist.songs).to eq []
|
40
|
+
expect(playlist.errors).to eq ['Can not get song lists from this playlist page.']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RMD::Zing::Song do
|
4
|
+
let(:link) { 'mp3.zing.vn/bai-hat/abc.mp3' }
|
5
|
+
let(:song) { described_class.new(link) }
|
6
|
+
|
7
|
+
describe '#fetch' do
|
8
|
+
before do
|
9
|
+
expect(song).to receive(:new_link)
|
10
|
+
.and_return(new_link).at_least(:once)
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when new link exists' do
|
14
|
+
let(:new_link) { 'mp3.zing.vn' }
|
15
|
+
let(:data_link) { 'mp3.zing.vn/data/mp3' }
|
16
|
+
|
17
|
+
before do
|
18
|
+
expect(RMD::Zing::Utils::CorrectUrl).to receive(:correct)
|
19
|
+
.with(new_link).and_return(data_link)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'returns correct new link' do
|
23
|
+
song.fetch
|
24
|
+
expect(song.data_link).to eq data_link
|
25
|
+
expect(song.errors).to be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when new link does not exist' do
|
30
|
+
let(:new_link) { nil }
|
31
|
+
|
32
|
+
it 'returns error' do
|
33
|
+
song.fetch
|
34
|
+
expect(song.data_link).to eq nil
|
35
|
+
expect(song.errors).to eq 'Can not get song from this link!'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#new_link' do
|
41
|
+
let(:page) { double('Page') }
|
42
|
+
let(:elements) { [element] }
|
43
|
+
let(:element) { double('Element', text: text) }
|
44
|
+
subject { song.send(:new_link) }
|
45
|
+
|
46
|
+
before do
|
47
|
+
expect(song).to receive(:page).and_return(page)
|
48
|
+
expect(page).to receive(:search).with('.detail-function script').and_return(elements)
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when match data exists' do
|
52
|
+
let(:text) { 'abc http://mp3.zing.vn/download/song/abc/xyz' }
|
53
|
+
it { is_expected.to eq 'http://mp3.zing.vn/download/song/abc/xyz' }
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when match data is not exists' do
|
57
|
+
let(:text) { 'abc http://mp3.zing.vn' }
|
58
|
+
it { is_expected.to eq nil }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#page' do
|
63
|
+
let(:agent) { instance_double('Mechanize') }
|
64
|
+
let(:page) { double('Page') }
|
65
|
+
subject { song.send(:page) }
|
66
|
+
|
67
|
+
before do
|
68
|
+
expect(song).to receive(:agent).and_return(agent)
|
69
|
+
expect(agent).to receive(:get).with(link).and_return(page)
|
70
|
+
end
|
71
|
+
|
72
|
+
it { is_expected.to eq page }
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#success?' do
|
76
|
+
subject { song.success? }
|
77
|
+
|
78
|
+
before do
|
79
|
+
allow(song).to receive(:data_link).and_return(data_link)
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when datalink is present' do
|
83
|
+
let(:data_link) { 'data_link' }
|
84
|
+
it { is_expected.to eq true }
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'when datalink is not present' do
|
88
|
+
let(:data_link) { nil }
|
89
|
+
it { is_expected.to eq false }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RMD::Zing::Utils::CorrectUrl do
|
4
|
+
describe '#correct' do
|
5
|
+
let(:util) { described_class.new(url) }
|
6
|
+
|
7
|
+
context 'when url is normal' do
|
8
|
+
let(:url) { 'http://www.nhaccuatui.com/download/song/tFBwsJKDGQX9' }
|
9
|
+
|
10
|
+
it 'returns that url' do
|
11
|
+
VCR.use_cassette('utils correct_url correct') do
|
12
|
+
expect(util.correct).to eq url
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when url is a redirect' do
|
18
|
+
let(:url) { 'http://mp3.zing.vn/download/song/Bird-TV-Size-Yuya-Matsushita/ZHJntZGsBidFQQQTLDxyDHkG' }
|
19
|
+
let(:redirect_url) { 'http://dl2.mp3.zdn.vn/fsdd1131lwwjA/74548e9982bf8c91fdbf7939139a5bb0/54ba2490/2011/06/05/d/f/dfed7ed9a9ed91387af6062db606e72f.mp3?filename=Bird%20TV%20Size%20-%20Yuya%20Matsushita.mp3' }
|
20
|
+
|
21
|
+
it 'returns that url' do
|
22
|
+
VCR.use_cassette('utils correct_url redirect') do
|
23
|
+
expect(util.correct).to eq redirect_url
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -18,8 +18,11 @@ require 'byebug'
|
|
18
18
|
require 'webmock/rspec'
|
19
19
|
require 'vcr'
|
20
20
|
require 'simplecov'
|
21
|
+
require 'coveralls'
|
21
22
|
require 'rmd'
|
23
|
+
Dir[__dir__ + '/support/**/*.rb'].each { |f| require f }
|
22
24
|
|
25
|
+
Coveralls.wear!
|
23
26
|
SimpleCov.start
|
24
27
|
|
25
28
|
VCR.configure do |config|
|
@@ -100,3 +103,22 @@ RSpec.configure do |config|
|
|
100
103
|
Kernel.srand config.seed
|
101
104
|
=end
|
102
105
|
end
|
106
|
+
|
107
|
+
def capture_io(&block)
|
108
|
+
original_stdout = $stdout
|
109
|
+
original_progressbar_stdout = ProgressBar::Output::DEFAULT_OUTPUT_STREAM
|
110
|
+
$stdout = fake = StringIO.new
|
111
|
+
redef_without_warning(ProgressBar::Output, 'DEFAULT_OUTPUT_STREAM', $stdout)
|
112
|
+
begin
|
113
|
+
yield
|
114
|
+
ensure
|
115
|
+
redef_without_warning(ProgressBar::Output, 'DEFAULT_OUTPUT_STREAM', original_progressbar_stdout)
|
116
|
+
$stdout = original_stdout
|
117
|
+
end
|
118
|
+
fake.string
|
119
|
+
end
|
120
|
+
|
121
|
+
def redef_without_warning(klass, const, value)
|
122
|
+
klass.send(:remove_const, const) if klass.const_defined?(const)
|
123
|
+
klass.const_set(const, value)
|
124
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
shared_examples 'RMD::Base::Playlist' do
|
2
|
+
describe '#success?' do
|
3
|
+
subject { playlist.success? }
|
4
|
+
|
5
|
+
before do
|
6
|
+
allow(playlist).to receive(:songs).and_return(songs)
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'when songs is nil' do
|
10
|
+
let(:songs) { nil }
|
11
|
+
it { is_expected.to eq false }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when songs is blank' do
|
15
|
+
let(:songs) { [] }
|
16
|
+
it { is_expected.to eq false }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'otherwise' do
|
20
|
+
let(:songs) { ['songs'] }
|
21
|
+
it { is_expected.to eq true }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#song_elements' do
|
26
|
+
let(:page) { double('Page') }
|
27
|
+
let(:song_element) { double('playlistElement') }
|
28
|
+
let(:song_elements) { [song_element] }
|
29
|
+
subject { playlist.send(:song_elements) }
|
30
|
+
|
31
|
+
before do
|
32
|
+
expect(playlist).to receive(:page).and_return(page)
|
33
|
+
expect(page).to receive(:search) .with(element_css)
|
34
|
+
.and_return(song_elements)
|
35
|
+
end
|
36
|
+
|
37
|
+
it { is_expected.to eq song_elements }
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#page' do
|
41
|
+
let(:agent) { instance_double('Mechanize') }
|
42
|
+
let(:page) { double('Page') }
|
43
|
+
subject { playlist.send(:page) }
|
44
|
+
|
45
|
+
before do
|
46
|
+
expect(playlist).to receive(:agent).and_return(agent)
|
47
|
+
expect(agent).to receive(:get).with(link).and_return(page)
|
48
|
+
end
|
49
|
+
|
50
|
+
it { is_expected.to eq page }
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#agent' do
|
54
|
+
it 'creates agent' do
|
55
|
+
expect(playlist.send(:agent)).to be_a(Mechanize)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hieu Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.6'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.1'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.1'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rspec
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -147,13 +161,22 @@ files:
|
|
147
161
|
- ".bundle/config"
|
148
162
|
- ".gitignore"
|
149
163
|
- ".rspec"
|
164
|
+
- ".travis.yml"
|
150
165
|
- Gemfile
|
151
166
|
- LICENSE.txt
|
152
167
|
- README.md
|
153
168
|
- Rakefile
|
154
169
|
- bin/rmd
|
170
|
+
- fixtures/vcr_cassettes/nhaccuatui_playlist.yml
|
171
|
+
- fixtures/vcr_cassettes/nhaccuatui_song.yml
|
155
172
|
- fixtures/vcr_cassettes/song_download.yml
|
173
|
+
- fixtures/vcr_cassettes/utils_correct_url_correct.yml
|
174
|
+
- fixtures/vcr_cassettes/utils_correct_url_redirect.yml
|
175
|
+
- fixtures/vcr_cassettes/zing_playlist.yml
|
176
|
+
- fixtures/vcr_cassettes/zing_song.yml
|
156
177
|
- lib/rmd.rb
|
178
|
+
- lib/rmd/base/playlist.rb
|
179
|
+
- lib/rmd/base/song.rb
|
157
180
|
- lib/rmd/downloader.rb
|
158
181
|
- lib/rmd/factory.rb
|
159
182
|
- lib/rmd/main.rb
|
@@ -165,7 +188,11 @@ files:
|
|
165
188
|
- lib/rmd/processor.rb
|
166
189
|
- lib/rmd/song_playlist_adapter.rb
|
167
190
|
- lib/rmd/version.rb
|
191
|
+
- lib/rmd/zing/playlist.rb
|
192
|
+
- lib/rmd/zing/song.rb
|
193
|
+
- lib/rmd/zing/utils/correct_url.rb
|
168
194
|
- rmd.gemspec
|
195
|
+
- spec/acceptants/main_spec.rb
|
169
196
|
- spec/rmd/downloader_spec.rb
|
170
197
|
- spec/rmd/factory_spec.rb
|
171
198
|
- spec/rmd/nct/getter/key_from_page_spec.rb
|
@@ -174,7 +201,12 @@ files:
|
|
174
201
|
- spec/rmd/nct/song_spec.rb
|
175
202
|
- spec/rmd/processor_spec.rb
|
176
203
|
- spec/rmd/song_playlist_adapter_spec.rb
|
204
|
+
- spec/rmd/zing/playlist_spec.rb
|
205
|
+
- spec/rmd/zing/song_spec.rb
|
206
|
+
- spec/rmd/zing/utils/correct_url_spec.rb
|
177
207
|
- spec/spec_helper.rb
|
208
|
+
- spec/support/download_share_examples.rb
|
209
|
+
- spec/support/playlist_share_examples.rb
|
178
210
|
homepage: https://github.com/hieuk09/rmd
|
179
211
|
licenses:
|
180
212
|
- MIT
|
@@ -200,6 +232,7 @@ signing_key:
|
|
200
232
|
specification_version: 4
|
201
233
|
summary: 'RMD: Ruby Music Dowloader'
|
202
234
|
test_files:
|
235
|
+
- spec/acceptants/main_spec.rb
|
203
236
|
- spec/rmd/downloader_spec.rb
|
204
237
|
- spec/rmd/factory_spec.rb
|
205
238
|
- spec/rmd/nct/getter/key_from_page_spec.rb
|
@@ -208,4 +241,9 @@ test_files:
|
|
208
241
|
- spec/rmd/nct/song_spec.rb
|
209
242
|
- spec/rmd/processor_spec.rb
|
210
243
|
- spec/rmd/song_playlist_adapter_spec.rb
|
244
|
+
- spec/rmd/zing/playlist_spec.rb
|
245
|
+
- spec/rmd/zing/song_spec.rb
|
246
|
+
- spec/rmd/zing/utils/correct_url_spec.rb
|
211
247
|
- spec/spec_helper.rb
|
248
|
+
- spec/support/download_share_examples.rb
|
249
|
+
- spec/support/playlist_share_examples.rb
|