vagalume 0.1.5 → 0.1.6
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/Gemfile.lock +6 -6
- data/lib/vagalume.rb +4 -3
- data/lib/vagalume/artist.rb +4 -6
- data/lib/vagalume/lyric_formatter.rb +30 -27
- data/lib/vagalume/search_result.rb +13 -12
- data/lib/vagalume/song.rb +28 -21
- data/spec/array_spec.rb +1 -1
- data/spec/base_spec.rb +14 -18
- data/spec/lyric_formatter_spec.rb +7 -7
- data/spec/search_result_spec.rb +17 -0
- data/spec/song_spec.rb +24 -0
- data/vagalume.gemspec +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cdb570dd97273427b15f1f1038d14673f7e8220b
|
4
|
+
data.tar.gz: 4dd491d32fabed72de2253289668845f398babf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20fd8b6211abf6acb9ae361a00bcda7c990bc18cc1816c45e31cf4c64a78fb88516d022baa4f7b6c1ddfcc94306482e409d75894836b54adb8df1f77f3f370c5
|
7
|
+
data.tar.gz: 3ea8b96d1a530ff86efde1f8d4f2657da8306bc1b3912f6f10a2a15ca02f3495b6cd107208b9c93ac7218297a88eea0126d57e593e2eeb9c620731a6b06f40a5
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
vagalume (0.1.
|
5
|
-
multi_json (~> 1.9
|
4
|
+
vagalume (0.1.6)
|
5
|
+
multi_json (~> 1.9)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
@@ -11,7 +11,7 @@ GEM
|
|
11
11
|
crack (0.4.2)
|
12
12
|
safe_yaml (~> 1.0.0)
|
13
13
|
diff-lcs (1.2.5)
|
14
|
-
multi_json (1.
|
14
|
+
multi_json (1.10.1)
|
15
15
|
rspec (2.14.1)
|
16
16
|
rspec-core (~> 2.14.0)
|
17
17
|
rspec-expectations (~> 2.14.0)
|
@@ -31,7 +31,7 @@ PLATFORMS
|
|
31
31
|
|
32
32
|
DEPENDENCIES
|
33
33
|
bundler (~> 1.3)
|
34
|
-
rspec (~> 2.14
|
34
|
+
rspec (~> 2.14)
|
35
35
|
vagalume!
|
36
|
-
vcr (~> 2.9
|
37
|
-
webmock (~> 1.17
|
36
|
+
vcr (~> 2.9)
|
37
|
+
webmock (~> 1.17)
|
data/lib/vagalume.rb
CHANGED
@@ -16,12 +16,13 @@ module Vagalume
|
|
16
16
|
|
17
17
|
def find(artist, song)
|
18
18
|
request_url = BASE_URL + "art=#{CGI.escape(artist)}&mus=#{CGI.escape(song)}"
|
19
|
-
|
20
|
-
search_result = Vagalume::SearchResult.
|
19
|
+
result = MultiJson.decode(open(request_url).read)
|
20
|
+
search_result = Vagalume::SearchResult.new(result)
|
21
21
|
end
|
22
22
|
|
23
23
|
def get_lyric(artist, song, options)
|
24
24
|
search = find(artist, song)
|
25
|
-
Vagalume::LyricFormatter.
|
25
|
+
formatter = Vagalume::LyricFormatter.new
|
26
|
+
formatter.format(search, options)
|
26
27
|
end
|
27
28
|
end
|
data/lib/vagalume/artist.rb
CHANGED
@@ -2,12 +2,10 @@ module Vagalume
|
|
2
2
|
class Artist
|
3
3
|
attr_accessor :id, :name, :url
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
artist.url = artist_json["url"]
|
10
|
-
artist
|
5
|
+
def initialize(artist)
|
6
|
+
@id = artist["id"]
|
7
|
+
@name = artist["name"]
|
8
|
+
@url = artist["url"]
|
11
9
|
end
|
12
10
|
end
|
13
11
|
end
|
@@ -1,40 +1,43 @@
|
|
1
|
-
|
2
|
-
class
|
1
|
+
module Vagalume
|
2
|
+
class LyricFormatter
|
3
3
|
def format(search, options)
|
4
|
-
|
5
|
-
song = search.song
|
6
|
-
translated_song = search.translations.with_language(Vagalume::Language::PORTUGUESE)
|
7
|
-
output = "\n\n"
|
4
|
+
return "No lyric found" if search.not_found?
|
8
5
|
|
9
|
-
|
10
|
-
return "\n\n#{song.name}\n\n#{song.lyric}" unless options[:translation]
|
11
|
-
return "No translation found" if translated_song.nil?
|
6
|
+
original_song = search.song
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
lyric_array += song.lyric.split("\n")
|
18
|
-
translation_array += translated_song.lyric.split("\n")
|
19
|
-
|
20
|
-
lyric_array.each_with_index do |lyric_line, index|
|
21
|
-
output += lyric_line + separator(bigger_line, lyric_line) + translation_array[index].to_s + "\n"
|
8
|
+
if options[:translation]
|
9
|
+
translated_song = search.translations.with_language(Vagalume::Language::PORTUGUESE)
|
10
|
+
return "No translation found" if translated_song.nil?
|
11
|
+
return formatted_song_with_transaction(original_song, translated_song)
|
22
12
|
end
|
23
|
-
|
13
|
+
|
14
|
+
"\n\n#{original_song.name}\n\n#{original_song.lyric}"
|
24
15
|
end
|
25
16
|
|
26
17
|
private
|
27
18
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
19
|
+
def formatted_song_with_transaction(song, translated_song)
|
20
|
+
original_lyrics_lines = [song.name, ""] + song.lyric.split("\n")
|
21
|
+
translated_lyrics_lines = [translated_song.name, ""] + translated_song.lyric.split("\n")
|
22
|
+
|
23
|
+
biggest_line_size = biggest_line_size(song.lyric)
|
24
|
+
formatted_output = "\n\n"
|
31
25
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
original_lyrics_lines.each_with_index do |original_line, index|
|
27
|
+
separator = find_separator(biggest_line_size, original_line)
|
28
|
+
translated_line = translated_lyrics_lines[index]
|
29
|
+
formatted_output += original_line + separator + translated_line.to_s + "\n"
|
36
30
|
end
|
37
|
-
|
31
|
+
|
32
|
+
formatted_output
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_separator(biggest_line_size, lyric_line)
|
36
|
+
" " * (biggest_line_size - lyric_line.size) + " | "
|
37
|
+
end
|
38
|
+
|
39
|
+
def biggest_line_size(lyric)
|
40
|
+
lyric.each_line.max { |a, b| a.length <=> b.length }.size
|
38
41
|
end
|
39
42
|
end
|
40
43
|
end
|
@@ -2,24 +2,25 @@ module Vagalume
|
|
2
2
|
class SearchResult
|
3
3
|
attr_accessor :status, :artist, :song, :translations
|
4
4
|
|
5
|
-
def initialize
|
5
|
+
def initialize(result)
|
6
6
|
@translations = []
|
7
|
-
|
7
|
+
@status = result["type"]
|
8
|
+
return if not_found?
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
result.status = result_json["type"]
|
12
|
-
return result if result.status == Vagalume::Status::NOT_FOUND || result.status == Vagalume::Status::SONG_NOT_FOUND
|
13
|
-
song = result_json["mus"].first
|
14
|
-
artist = result_json["art"]
|
10
|
+
song = result["mus"].first
|
11
|
+
artist = result["art"]
|
15
12
|
translations = song["translate"] || []
|
16
|
-
|
17
|
-
|
13
|
+
@song = Vagalume::Song.new(song)
|
14
|
+
@artist = Vagalume::Artist.new(artist)
|
18
15
|
|
19
16
|
translations.each do |translation|
|
20
|
-
|
17
|
+
@translations << Vagalume::Song.new(translation)
|
21
18
|
end
|
22
|
-
|
19
|
+
end
|
20
|
+
|
21
|
+
def not_found?
|
22
|
+
@status == Vagalume::Status::NOT_FOUND ||
|
23
|
+
@status == Vagalume::Status::SONG_NOT_FOUND
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
data/lib/vagalume/song.rb
CHANGED
@@ -2,18 +2,17 @@ module Vagalume
|
|
2
2
|
class Song
|
3
3
|
attr_accessor :id, :name, :language, :url, :lyric
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
if
|
13
|
-
|
14
|
-
|
5
|
+
def initialize(song)
|
6
|
+
@id = song["id"]
|
7
|
+
@language = song["lang"]
|
8
|
+
@url = song["url"]
|
9
|
+
@lyric = song["text"]
|
10
|
+
@name = song["name"]
|
11
|
+
|
12
|
+
if translation?
|
13
|
+
@name = get_name_from_lyric(@lyric)
|
14
|
+
@lyric = remove_title(@lyric)
|
15
15
|
end
|
16
|
-
song
|
17
16
|
end
|
18
17
|
|
19
18
|
def translation?
|
@@ -22,20 +21,28 @@ module Vagalume
|
|
22
21
|
|
23
22
|
private
|
24
23
|
|
25
|
-
def
|
24
|
+
def get_name_from_lyric(lyric)
|
26
25
|
title = lyric.lines.first
|
27
26
|
title.gsub(/\[|\]|\n/, "")
|
28
27
|
end
|
29
28
|
|
30
|
-
# This is necessary because
|
31
|
-
# lyric text,
|
32
|
-
#
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
29
|
+
# This is necessary because, for translations, the song title comes with the
|
30
|
+
# lyric text. Also, the format is not always the same, sometimes it's just one line
|
31
|
+
# for the title, sometimes it's the title followed by some empty lines.
|
32
|
+
# Here we remove the first line and any following empty lines, so we have
|
33
|
+
# a consident API.
|
34
|
+
def remove_title(lyric)
|
35
|
+
lines = lyric.lines
|
36
|
+
lines.shift
|
37
|
+
lines = remove_empty_lines_from_beginning(lines)
|
38
|
+
lines.join
|
39
|
+
end
|
40
|
+
|
41
|
+
def remove_empty_lines_from_beginning(lines)
|
42
|
+
return lines unless lines.first.empty? || lines.first == "\n"
|
43
|
+
|
44
|
+
lines.shift
|
45
|
+
remove_empty_lines_from_beginning(lines)
|
39
46
|
end
|
40
47
|
end
|
41
48
|
end
|
data/spec/array_spec.rb
CHANGED
data/spec/base_spec.rb
CHANGED
@@ -4,52 +4,48 @@ require "spec_helper"
|
|
4
4
|
|
5
5
|
describe Vagalume do
|
6
6
|
|
7
|
-
before
|
7
|
+
before do
|
8
8
|
VCR.use_cassette('vagalume') do
|
9
9
|
@result = Vagalume.find("Metallica", "The Unforgiven")
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
it "
|
14
|
-
song = @result.song
|
15
|
-
artist = @result.artist
|
16
|
-
lyric = File.read 'spec/assets/unforgiven_lyric.txt'
|
17
|
-
|
13
|
+
it "returns parsed result" do
|
18
14
|
@result.status.should == Vagalume::Status::EXACT
|
19
15
|
|
20
|
-
song.id.should == "3ade68b6g470deda3"
|
21
|
-
song.name.should == "The Unforgiven"
|
22
|
-
song.language.should == Vagalume::Language::ENGLISH
|
23
|
-
song.url.should == "http://www.vagalume.com.br/metallica/the-unforgiven.html"
|
24
|
-
song.lyric.should ==
|
16
|
+
@result.song.id.should == "3ade68b6g470deda3"
|
17
|
+
@result.song.name.should == "The Unforgiven"
|
18
|
+
@result.song.language.should == Vagalume::Language::ENGLISH
|
19
|
+
@result.song.url.should == "http://www.vagalume.com.br/metallica/the-unforgiven.html"
|
20
|
+
@result.song.lyric.should == File.read('spec/assets/unforgiven_lyric.txt').chop
|
25
21
|
|
26
|
-
artist.id.should == "3ade68b5g7257eda3"
|
27
|
-
artist.name.should == "Metallica"
|
28
|
-
artist.url.should == "http://www.vagalume.com.br/metallica/"
|
22
|
+
@result.artist.id.should == "3ade68b5g7257eda3"
|
23
|
+
@result.artist.name.should == "Metallica"
|
24
|
+
@result.artist.url.should == "http://www.vagalume.com.br/metallica/"
|
29
25
|
end
|
30
26
|
|
31
|
-
it "
|
27
|
+
it "returns result with song not found status" do
|
32
28
|
VCR.use_cassette('vagalume_song_not_found') do
|
33
29
|
result = Vagalume.find("Metallica", "Oops")
|
34
30
|
result.status.should == Vagalume::Status::SONG_NOT_FOUND
|
35
31
|
end
|
36
32
|
end
|
37
33
|
|
38
|
-
it "
|
34
|
+
it "returns result with not found status" do
|
39
35
|
VCR.use_cassette('vagalume_not_found') do
|
40
36
|
result = Vagalume.find("Oops", "Oops")
|
41
37
|
result.status.should == Vagalume::Status::NOT_FOUND
|
42
38
|
end
|
43
39
|
end
|
44
40
|
|
45
|
-
it "
|
41
|
+
it "has translations" do
|
46
42
|
@result.translations.should_not be_empty
|
47
43
|
pt_translation = @result.translations.with_language(Vagalume::Language::PORTUGUESE)
|
48
44
|
lyric = File.read 'spec/assets/unforgiven_lyric_translation_pt.txt'
|
49
45
|
pt_translation.lyric.should == lyric.chop!
|
50
46
|
end
|
51
47
|
|
52
|
-
it "
|
48
|
+
it "gets the right song name for translations" do
|
53
49
|
translated_song = @result.translations.with_language(Vagalume::Language::PORTUGUESE)
|
54
50
|
translated_song.name.should == "Os Imperdoáveis"
|
55
51
|
end
|
@@ -4,33 +4,33 @@ require "spec_helper"
|
|
4
4
|
|
5
5
|
describe Vagalume::LyricFormatter do
|
6
6
|
context "there is a translation available" do
|
7
|
-
before
|
7
|
+
before do
|
8
8
|
VCR.use_cassette('vagalume') do
|
9
9
|
@search = Vagalume.find("Metallica", "The Unforgiven")
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
it "
|
13
|
+
it "formats song without translation option" do
|
14
14
|
options = {:translation => false}
|
15
|
-
formatted_lyric =
|
15
|
+
formatted_lyric = subject.format(@search, options)
|
16
16
|
lyric = File.read 'spec/assets/lyric_formatter/unforgiven_lyric.txt'
|
17
17
|
formatted_lyric.should == lyric
|
18
18
|
end
|
19
19
|
|
20
|
-
it "
|
20
|
+
it "formats song with translation" do
|
21
21
|
options = {:translation => true}
|
22
|
-
formatted_lyric =
|
22
|
+
formatted_lyric = subject.format(@search, options)
|
23
23
|
lyric = File.read 'spec/assets/lyric_formatter/unforgiven_lyric_with_translation.txt'
|
24
24
|
formatted_lyric.should == lyric
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
context "there is no translation available" do
|
29
|
-
it "
|
29
|
+
it "informs that there is no translation available" do
|
30
30
|
VCR.use_cassette('vagalume_with_no_translation_available') do
|
31
31
|
@search = Vagalume.find("Bruce Springsteen", "Ain't good enough for You")
|
32
32
|
options = {:translation => true}
|
33
|
-
output =
|
33
|
+
output = subject.format(@search, options)
|
34
34
|
output.should == "No translation found"
|
35
35
|
end
|
36
36
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Vagalume::SearchResult do
|
6
|
+
it 'knows the song was not found when the status is NOT_FOUND' do
|
7
|
+
result = { "type" => Vagalume::Status::NOT_FOUND }
|
8
|
+
search_result = Vagalume::SearchResult.new(result)
|
9
|
+
search_result.not_found?.should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'knows the song was not found when the status is SONG_NOT_FOUND' do
|
13
|
+
result = { "type" => Vagalume::Status::SONG_NOT_FOUND }
|
14
|
+
search_result = Vagalume::SearchResult.new(result)
|
15
|
+
search_result.not_found?.should be_true
|
16
|
+
end
|
17
|
+
end
|
data/spec/song_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Vagalume::Song do
|
6
|
+
let(:translation_lyric) do
|
7
|
+
"title
|
8
|
+
|
9
|
+
|
10
|
+
Lyric"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "removes the title from the lyrics for translations" do
|
14
|
+
params = { "name" => nil, "text" => translation_lyric }
|
15
|
+
song = Vagalume::Song.new(params)
|
16
|
+
song.lyric.strip.should == "Lyric"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "doesn't change the lyrics when it's not a translation" do
|
20
|
+
params = { "name" => "Foo", "text" => translation_lyric }
|
21
|
+
song = Vagalume::Song.new(params)
|
22
|
+
song.lyric.should == translation_lyric
|
23
|
+
end
|
24
|
+
end
|
data/vagalume.gemspec
CHANGED
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "vagalume"
|
7
7
|
spec.executables = ["vagalume"]
|
8
|
-
spec.version = "0.1.
|
8
|
+
spec.version = "0.1.6"
|
9
9
|
spec.authors = ["Brian Thomas Storti"]
|
10
10
|
spec.email = ["btstorti@gmail.com"]
|
11
11
|
spec.description = "Ruby interface for the Vagalume API"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagalume
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Thomas Storti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -115,6 +115,8 @@ files:
|
|
115
115
|
- spec/fixtures/vcr_cassettes/vagalume_song_not_found.yml
|
116
116
|
- spec/fixtures/vcr_cassettes/vagalume_with_no_translation_available.yml
|
117
117
|
- spec/lyric_formatter_spec.rb
|
118
|
+
- spec/search_result_spec.rb
|
119
|
+
- spec/song_spec.rb
|
118
120
|
- spec/spec_helper.rb
|
119
121
|
- vagalume.gemspec
|
120
122
|
- vagalume.jpg
|