chordpro 0.0.1 → 1.0.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.
@@ -1,27 +1,44 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Chordpro::HTML do
4
4
  def html(string)
5
- Chordpro::HTML.new(Chordpro::Parser.new.parse(string))
5
+ Chordpro.html(string)
6
6
  end
7
7
 
8
- %w(title t).each do |name|
8
+ %w[title t].each do |name|
9
9
  it "renders h1 for #{name}" do
10
10
  expect(html("{#{name}: Blackbird}").to_s).to eq('<h1 class="title">Blackbird</h1>')
11
11
  end
12
12
  end
13
13
 
14
- %w(subtitle st su).each do |name|
14
+ it "guards against xss in the title" do
15
+ expect(html('{title: <script>alert("oops");</script>}').to_s).to_not include("<script>")
16
+ end
17
+
18
+ %w[subtitle st su].each do |name|
15
19
  it "renders h2 for #{name}" do
16
20
  expect(html("{#{name}:The Beatles}").to_s).to eq('<h2 class="subtitle">The Beatles</h2>')
17
21
  end
18
22
  end
19
23
 
24
+ it "guards against xss in the subtitle" do
25
+ expect(html('{subtitle: <script>alert("oops");</script>}').to_s).to_not include("<script>")
26
+ end
27
+
20
28
  it "renders line" do
21
29
  expect(html("[G7]I dreamed I [C]held you in my [G]arms").to_s).to eq(
22
- '<table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr>' +
23
- '<tr><td>I dreamed I </td><td>held you in my </td><td>arms</td></tr></table>'
30
+ '<table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr>' \
31
+ "<tr><td>I dreamed I </td><td>held you in my </td><td>arms</td></tr></table>"
24
32
  )
25
33
  end
26
34
 
35
+ it "guards against xss in chords and lyrics" do
36
+ expect(html('[<script>alert("oops");</script>]<script>alert("oops");</script>').to_s).to_not include("<script>")
37
+ end
38
+
39
+ it "does not blow up with multiple chords in a row" do
40
+ expect(html("[G][C][D]")).to eq(
41
+ '<table><tr class="chords"><td>G</td><td>C</td><td>D</td></tr></table>'
42
+ )
43
+ end
27
44
  end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe Chordpro::Line do
4
+ describe "accept" do
5
+ let(:visitor) { double(:visitor) }
6
+ let(:line) { Chordpro::Line.new([]) }
7
+
8
+ it "calls method on visitor" do
9
+ expect(visitor).to receive(:line).and_return("line")
10
+ expect(line.accept(visitor)).to eq("line")
11
+ end
12
+
13
+ it "returns line when visitor does not respond to method" do
14
+ expect(line.accept(visitor)).to be_instance_of(Chordpro::Line)
15
+ end
16
+ end
17
+ end
@@ -1,109 +1,115 @@
1
- require 'spec_helper'
2
- require 'parslet/rig/rspec'
1
+ require "spec_helper"
2
+ require "parslet/rig/rspec"
3
3
 
4
4
  describe Chordpro::Parser do
5
5
  let(:parser) { Chordpro::Parser.new }
6
6
 
7
7
  subject { parser.send self.class.description }
8
8
 
9
- describe 'space' do
10
- it { should parse(' ') }
11
- it { should parse(' ') }
12
- it { should parse('') }
13
- it { should_not parse('x') }
9
+ describe "space" do
10
+ it { should parse(" ") }
11
+ it { should parse(" ") }
12
+ it { should parse("") }
13
+ it { should_not parse("x") }
14
14
  end
15
15
 
16
- describe 'colon' do
17
- it { should parse(':') }
18
- it { should_not parse('x') }
16
+ describe "colon" do
17
+ it { should parse(":") }
18
+ it { should_not parse("x") }
19
19
  end
20
20
 
21
- describe 'newline' do
21
+ describe "newline" do
22
22
  it { should parse("\n") }
23
23
  it { should_not parse("x") }
24
24
  end
25
25
 
26
- describe 'lbrace' do
26
+ describe "lbrace" do
27
27
  it { should parse("{") }
28
28
  it { should_not parse("[") }
29
29
  end
30
30
 
31
- describe 'rbrace' do
31
+ describe "rbrace" do
32
32
  it { should parse("}") }
33
33
  it { should_not parse("]") }
34
34
  end
35
35
 
36
- describe 'lbracket' do
36
+ describe "lbracket" do
37
37
  it { should parse("[") }
38
38
  it { should_not parse("{") }
39
39
  end
40
40
 
41
- describe 'rbracket' do
41
+ describe "rbracket" do
42
42
  it { should parse("]") }
43
43
  it { should_not parse("}") }
44
44
  end
45
45
 
46
- describe 'identifier' do
47
- it { should parse('title') }
48
- it { should parse('t') }
49
- it { should_not parse(' abcdef') }
50
- it { should_not parse(' ') }
51
- it { should_not parse('') }
46
+ describe "identifier" do
47
+ it { should parse("title") }
48
+ it { should parse("t") }
49
+ it { should_not parse(" abcdef") }
50
+ it { should_not parse(" ") }
51
+ it { should_not parse("") }
52
52
  end
53
53
 
54
- describe 'value' do
55
- it { should parse('some value') }
56
- it { should parse(' ahoy ').as(' ahoy ') }
57
- it { should_not parse('oops}') }
54
+ describe "value" do
55
+ it { should parse("some value") }
56
+ it { should parse(" ahoy ").as(" ahoy ") }
57
+ it { should_not parse("oops}") }
58
58
  end
59
59
 
60
- describe 'directive' do
61
- it { should parse('{title:Royals}').as(:directive => {:name => 'title', :value => 'Royals'}) }
60
+ describe "comment" do
61
+ it { should parse("# ignore this") }
62
+ it { should_not parse("but you can't # ignore this") }
63
+ end
64
+
65
+ describe "directive" do
66
+ it { should parse("{title:Royals}").as(directive: {name: "title", value: "Royals"}) }
62
67
  # FIXME: remove trailing space from value
63
- it { should parse('{ title : Get Lucky }').as(:directive => {:name => 'title', :value => 'Get Lucky '}) }
64
- it { should parse('{soc}').as(:directive => {:name => 'soc'}) }
65
- it { should_not parse('{st:oops') }
68
+ it { should parse("{ title : Get Lucky }").as(directive: {name: "title", value: "Get Lucky "}) }
69
+ it { should parse("{soc}").as(directive: {name: "soc"}) }
70
+ it { should_not parse("{st:oops") }
66
71
  end
67
72
 
68
- describe 'chord' do
69
- %w(A Bb C# Dm Edim Fmaj Gsus2 A/C#).each do |chord|
70
- it { should parse("[#{chord}]").as(:chord => chord) }
73
+ describe "chord" do
74
+ %w[A Bb C# Dm Edim Fmaj Gsus2 A/C#].each do |chord|
75
+ it { should parse("[#{chord}]").as(chord: chord) }
71
76
  end
72
77
 
73
- it { should_not parse('[G') }
78
+ it { should_not parse("[G") }
74
79
  end
75
80
 
76
- describe 'lyric' do
81
+ describe "lyric" do
77
82
  it { should parse("I've never seen") }
78
- it { should parse(" a diamond in the ")}
83
+ it { should parse(" a diamond in the ") }
79
84
  it { should_not parse("in the[") }
80
85
  it { should_not parse("in the\n") }
81
86
  end
82
87
 
83
- describe 'line' do
84
- it { should parse("[G]You are my sunshine").as(:line => [{:chord => 'G'}, {:lyric => 'You are my sunshine'}]) }
85
- it { should parse("You make me [C]happy when skies are [G]gray").as(:line => [
86
- {:lyric => 'You make me '},
87
- {:chord => 'C'},
88
- {:lyric => 'happy when skies are '},
89
- {:chord => 'G'},
90
- {:lyric => 'gray'}
91
- ]) }
92
-
93
- it { should parse("words with a newline\n").as(:line => [{:lyric => "words with a newline"}]) }
88
+ describe "line" do
89
+ it { should parse("[G]You are my sunshine").as(line: [{chord: "G"}, {lyric: "You are my sunshine"}]) }
90
+ it {
91
+ should parse("You make me [C]happy when skies are [G]gray").as(line: [
92
+ {lyric: "You make me "},
93
+ {chord: "C"},
94
+ {lyric: "happy when skies are "},
95
+ {chord: "G"},
96
+ {lyric: "gray"}
97
+ ])
98
+ }
99
+
100
+ it { should parse("words with a newline\n").as(line: [{lyric: "words with a newline"}]) }
94
101
  it { should_not parse("foo\nbar") }
95
102
  end
96
103
 
97
- describe 'song' do
104
+ describe "song" do
98
105
  it do
99
- song = "{title: I'll Fly Away}\n\n[C]I'll fly away, [C7]oh, glory\n[F]I'll fly [C]away\n"
100
- should parse(song).as({:song => [
101
- {:directive => {:name => "title", :value => "I'll Fly Away"}},
102
- {:newline => "\n"},
103
- {:line => [{:chord => "C"}, {:lyric => "I'll fly away, "}, {:chord => "C7"}, {:lyric => "oh, glory"}]},
104
- {:line => [{:chord => "F"}, {:lyric => "I'll fly "}, {:chord => "C"}, {:lyric => "away"}]}
106
+ song = "# A song\n{title: I'll Fly Away}\n\n[C]I'll fly away, [C7]oh, glory\n[F]I'll fly [C]away\n"
107
+ should parse(song).as({song: [
108
+ {directive: {name: "title", value: "I'll Fly Away"}},
109
+ {linebreak: "\n"},
110
+ {line: [{chord: "C"}, {lyric: "I'll fly away, "}, {chord: "C7"}, {lyric: "oh, glory"}]},
111
+ {line: [{chord: "F"}, {lyric: "I'll fly "}, {chord: "C"}, {lyric: "away"}]}
105
112
  ]})
106
-
107
113
  end
108
114
  end
109
115
  end
@@ -0,0 +1,56 @@
1
+ require "spec_helper"
2
+
3
+ module Chordpro
4
+ describe Song do
5
+ describe "metadata" do
6
+ let(:song) { Chordpro.parse("{title: Africa}\n{artist: Justin Timberlake}\n{artist: Jimmy Fallon}") }
7
+
8
+ it "returns nil if missing" do
9
+ expect(song.metadata["capo"]).to be(nil)
10
+ end
11
+
12
+ it "returns single value" do
13
+ expect(song.metadata["title"]).to eq("Africa")
14
+ expect(song.metadata[:title]).to eq("Africa")
15
+ end
16
+
17
+ it "returns array for multiple values" do
18
+ expect(song.metadata["artist"]).to eq(["Justin Timberlake", "Jimmy Fallon"])
19
+ expect(song.metadata[:artist]).to eq(song.metadata["artist"])
20
+ end
21
+
22
+ it "returns nil for unknown directive" do
23
+ song = Chordpro.parse("{foo: bar}")
24
+ expect(song.metadata["foo"]).to eq(nil)
25
+ end
26
+
27
+ it "returns hash with to_h" do
28
+ expect(song.metadata.to_h).to eq({
29
+ "title" => "Africa",
30
+ "artist" => ["Justin Timberlake", "Jimmy Fallon"]
31
+ })
32
+ end
33
+ end
34
+
35
+ describe "method_missing" do
36
+ let(:song) { Chordpro.parse("{title: The Title}\n{st: The Subtitle}") }
37
+
38
+ it "responds to method for directives" do
39
+ expect(song.respond_to?(:title)).to be(true)
40
+ expect(song.respond_to?(:subtitle)).to be(true)
41
+ expect(song.title).to eq("The Title")
42
+ expect(song.subtitle).to eq("The Subtitle")
43
+ end
44
+
45
+ it "responds to method for directive aliases" do
46
+ expect(song.respond_to?(:t)).to be(true)
47
+ expect(song.respond_to?(:st)).to be(true)
48
+ expect(song.t).to eq("The Title")
49
+ expect(song.st).to eq("The Subtitle")
50
+ end
51
+
52
+ it "does not respond to unknown directive" do
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ describe Chordpro::Transform do
4
+ let(:transform) { Chordpro::Transform.new }
5
+
6
+ describe "directive" do
7
+ subject { transform.apply(directive: {name: "title", value: "Two of Us"}) }
8
+
9
+ it { should be_kind_of(Chordpro::Directive) }
10
+ it { expect(subject.name).to eq("title") }
11
+ it { expect(subject.value).to eq("Two of Us") }
12
+ end
13
+
14
+ describe "directive without a value" do
15
+ subject { transform.apply(directive: {name: "soc"}) }
16
+
17
+ it { should be_kind_of(Chordpro::Directive) }
18
+ it { expect(subject.name).to eq("soc") }
19
+ end
20
+
21
+ describe "chord" do
22
+ subject { transform.apply(chord: "G") }
23
+
24
+ it { should be_kind_of(Chordpro::Chord) }
25
+ it { expect(subject.name).to eq("G") }
26
+ end
27
+
28
+ describe "chord" do
29
+ subject { transform.apply(chord: "G") }
30
+
31
+ it { should be_kind_of(Chordpro::Chord) }
32
+ it { expect(subject.name).to eq("G") }
33
+ end
34
+
35
+ describe "linebreak" do
36
+ subject { transform.apply(linebreak: "\n") }
37
+
38
+ it { should be_kind_of(Chordpro::Linebreak) }
39
+ end
40
+
41
+ describe "line" do
42
+ subject do
43
+ transform.apply(line: [
44
+ {chord: "G"},
45
+ {lyric: "You are my sunshine"}
46
+ ])
47
+ end
48
+
49
+ it { should be_kind_of(Chordpro::Line) }
50
+ it { expect(subject.parts.length).to eq(2) }
51
+ it { expect(subject.parts[0]).to be_instance_of(Chordpro::Chord) }
52
+ it { expect(subject.parts[1]).to be_instance_of(Chordpro::Lyric) }
53
+ end
54
+
55
+ describe "song" do
56
+ subject do
57
+ transform.apply(song: [
58
+ {directive: {name: "title", value: "You Are My Sunshine"}},
59
+ {line: [{chord: "G"}, {lyric: "You are my sunshine"}]}
60
+ ])
61
+ end
62
+
63
+ it { should be_kind_of(Chordpro::Song) }
64
+ end
65
+ end
data/spec/example_spec.rb CHANGED
@@ -1,17 +1,22 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
- describe 'Examples' do
4
- Dir[File.expand_path('../fixtures/*.crd', __FILE__)].each do |file|
3
+ describe "Examples" do
4
+ Dir[File.expand_path("../fixtures/*.crd", __FILE__)].each do |file|
5
5
  name = File.basename(file)
6
6
 
7
- describe name, :example => name do
8
- it 'matches the example' do
9
- expected = Chordpro.html(File.read(file))
10
- actual = File.read(file.gsub(/\.crd$/, '.html'))
7
+ describe name, example: name do
8
+ it "matches the example" do
9
+ html_file = file.gsub(/\.crd$/, ".html")
10
+ actual = Chordpro.html(File.read(file))
11
11
 
12
- expect(expected).to eq(actual)
12
+ # Allow overwriting the HTML fixture with the actual output. This is
13
+ # useful when the desired output format changes.
14
+ File.open(html_file, "w") { |f| f << actual } if ENV["OVERWRITE"]
15
+
16
+ expected = File.read(html_file)
17
+
18
+ expect(actual).to eq(expected)
13
19
  end
14
20
  end
15
-
16
21
  end
17
22
  end
@@ -1,4 +1,5 @@
1
1
  {title: You Are My Sunshine}
2
+ {key: G}
2
3
 
3
4
  {c:Verse 1}
4
5
  [G]The other night dear as I lay sleeping
@@ -1,27 +1 @@
1
- <h1 class="title">You Are My Sunshine</h1>
2
- <br>
3
- <span class="comment">Verse 1</span>
4
- <table><tr class="chords"><td>G</td></tr><tr><td>The other night dear as I lay sleeping</td></tr></table>
5
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>I dreamed I </td><td>held you in my </td><td>arms</td></tr></table>
6
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>But when I a</td><td>woke dear I was mis</td><td>taken</td></tr></table>
7
- <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>So I hung my </td><td>head and </td><td>cried</td></tr></table>
8
- <br>
9
- <span class="comment">Chorus</span>
10
-
11
- <table><tr class="chords"><td></td></tr><tr><td>You are my sunshine my only sunshine</td></tr></table>
12
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>You make me </td><td>happy when skies are </td><td>gray</td></tr></table>
13
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>You'll never </td><td>know dear how much I </td><td>love you</td></tr></table>
14
- <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>Please don't take </td><td>my sunshine a</td><td>way</td></tr></table>
15
-
16
- <br>
17
- <span class="comment">Verse 2</span>
18
- <table><tr class="chords"><td></td></tr><tr><td>I'll always love you and make you happy</td></tr></table>
19
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>If you will </td><td>only say the </td><td>same</td></tr></table>
20
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>But if you </td><td>leave me and love an</td><td>other</td></tr></table>
21
- <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>You'll regret </td><td>it all some </td><td>day</td></tr></table>
22
- <br>
23
- <span class="comment">Verse 3</span>
24
- <table><tr class="chords"><td></td></tr><tr><td>You told me once dear you really loved me</td></tr></table>
25
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>And no one </td><td>else could come be</td><td>tween</td></tr></table>
26
- <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>But now you've </td><td>left me and love an</td><td>other</td></tr></table>
27
- <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>You have shattered </td><td>all of my </td><td>dreams</td></tr></table>
1
+ <h1 class="title">You Are My Sunshine</h1><br/><span class="comment">Verse 1</span><table><tr class="chords"><td>G</td></tr><tr><td>The other night dear as I lay sleeping</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>I dreamed I </td><td>held you in my </td><td>arms</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>But when I a</td><td>woke dear I was mis</td><td>taken</td></tr></table><table><tr class="chords"><td></td><td>D⁷</td><td>G</td></tr><tr><td>So I hung my </td><td>head and </td><td>cried</td></tr></table><br/><span class="comment">Chorus</span><table><tr><td>You are my sunshine my only sunshine</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>You make me </td><td>happy when skies are </td><td>gray</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>You'll never </td><td>know dear how much I </td><td>love you</td></tr></table><table><tr class="chords"><td></td><td>D⁷</td><td>G</td></tr><tr><td>Please don't take </td><td>my sunshine a</td><td>way</td></tr></table><br/><span class="comment">Verse 2</span><table><tr><td>I'll always love you and make you happy</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>If you will </td><td>only say the </td><td>same</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>But if you </td><td>leave me and love an</td><td>other</td></tr></table><table><tr class="chords"><td></td><td>D⁷</td><td>G</td></tr><tr><td>You'll regret </td><td>it all some </td><td>day</td></tr></table><br/><span class="comment">Verse 3</span><table><tr><td>You told me once dear you really loved me</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>And no one </td><td>else could come be</td><td>tween</td></tr></table><table><tr class="chords"><td>G⁷</td><td>C</td><td>G</td></tr><tr><td>But now you've </td><td>left me and love an</td><td>other</td></tr></table><table><tr class="chords"><td></td><td>D⁷</td><td>G</td></tr><tr><td>You have shattered </td><td>all of my </td><td>dreams</td></tr></table>
data/spec/spec_helper.rb CHANGED
@@ -1 +1,2 @@
1
- require 'chordpro'
1
+ require "chordpro"
2
+ require "pry"
metadata CHANGED
@@ -1,83 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chordpro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-30 00:00:00.000000000 Z
11
+ date: 2022-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: builder
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - '>='
45
+ - - ">="
32
46
  - !ruby/object:Gem::Version
33
47
  version: '0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - '>='
52
+ - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '>='
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - '>='
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - '>='
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '>='
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: guard-rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '>='
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '>='
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  description: A ruby parser for the chordpro song file format.
@@ -87,7 +101,7 @@ executables: []
87
101
  extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
90
- - .gitignore
104
+ - ".gitignore"
91
105
  - Gemfile
92
106
  - Guardfile
93
107
  - LICENSE.txt
@@ -95,11 +109,25 @@ files:
95
109
  - Rakefile
96
110
  - chordpro.gemspec
97
111
  - lib/chordpro.rb
112
+ - lib/chordpro/chord.rb
113
+ - lib/chordpro/directive.rb
98
114
  - lib/chordpro/html.rb
115
+ - lib/chordpro/line.rb
116
+ - lib/chordpro/linebreak.rb
117
+ - lib/chordpro/lyric.rb
118
+ - lib/chordpro/metadata.rb
99
119
  - lib/chordpro/parser.rb
120
+ - lib/chordpro/setup.rb
121
+ - lib/chordpro/song.rb
122
+ - lib/chordpro/transform.rb
100
123
  - lib/chordpro/version.rb
124
+ - spec/chordpro/chord_spec.rb
125
+ - spec/chordpro/directive_spec.rb
101
126
  - spec/chordpro/html_spec.rb
127
+ - spec/chordpro/line_spec.rb
102
128
  - spec/chordpro/parser_spec.rb
129
+ - spec/chordpro/song_spec.rb
130
+ - spec/chordpro/transform_spec.rb
103
131
  - spec/example_spec.rb
104
132
  - spec/fixtures/example.css
105
133
  - spec/fixtures/sunshine.crd
@@ -109,29 +137,33 @@ homepage: https://github.com/bkeepers/chordpro
109
137
  licenses:
110
138
  - MIT
111
139
  metadata: {}
112
- post_install_message:
140
+ post_install_message:
113
141
  rdoc_options: []
114
142
  require_paths:
115
143
  - lib
116
144
  required_ruby_version: !ruby/object:Gem::Requirement
117
145
  requirements:
118
- - - '>='
146
+ - - ">="
119
147
  - !ruby/object:Gem::Version
120
148
  version: '0'
121
149
  required_rubygems_version: !ruby/object:Gem::Requirement
122
150
  requirements:
123
- - - '>='
151
+ - - ">="
124
152
  - !ruby/object:Gem::Version
125
153
  version: '0'
126
154
  requirements: []
127
- rubyforge_project:
128
- rubygems_version: 2.0.3
129
- signing_key:
155
+ rubygems_version: 3.2.22
156
+ signing_key:
130
157
  specification_version: 4
131
158
  summary: A ruby parser for the chordpro song file format.
132
159
  test_files:
160
+ - spec/chordpro/chord_spec.rb
161
+ - spec/chordpro/directive_spec.rb
133
162
  - spec/chordpro/html_spec.rb
163
+ - spec/chordpro/line_spec.rb
134
164
  - spec/chordpro/parser_spec.rb
165
+ - spec/chordpro/song_spec.rb
166
+ - spec/chordpro/transform_spec.rb
135
167
  - spec/example_spec.rb
136
168
  - spec/fixtures/example.css
137
169
  - spec/fixtures/sunshine.crd