chordpro 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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8c3a004dac5edc5dabd80b9ee292460013c79cc4
4
+ data.tar.gz: 9aa3b8f96010c1a14ed487d0ebdf308ba81f8e6d
5
+ SHA512:
6
+ metadata.gz: 497c61b56fb5ff17f4fb85621bdb43e1a2d87f5fe15bdaba179ac3e402df71dbdbbc5a00e9c26c611b5a6798faca964a1cde14612aef6cd98aa274a70a611351
7
+ data.tar.gz: fa3c1f328439bff9d08a798ba297d51a408c203124045a4873fd89c3beadbb374f85846ebd7cd09c1958335c7c8f0598291c8f737a2d5827248897973e499f1c
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in chordpro.gemspec
4
+ gemspec
5
+
6
+ gem 'pry'
@@ -0,0 +1,5 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^spec/spec_helper.rb$}) { "spec" }
4
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
5
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Brandon Keepers
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,31 @@
1
+ # Chordpro
2
+
3
+ A ruby parser for the [chordpro](http://tenbyten.com/software/songsgen/help/HtmlHelp/files_reference.htm) song file format.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'chordpro'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install chordpro
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ html = Chordpro.html(File.read('spec/fixtures/sunshine.crd'))
23
+ ```
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create new Pull Request
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ desc "Run all specs"
6
+ RSpec::Core::RakeTask.new(:spec) do |t|
7
+ t.rspec_opts = %w[--color]
8
+ t.verbose = false
9
+ end
10
+
11
+ task :default => :spec
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'chordpro/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "chordpro"
8
+ spec.version = Chordpro::VERSION
9
+ spec.authors = ["Brandon Keepers"]
10
+ spec.email = ["brandon@opensoul.org"]
11
+ spec.summary = %q{A ruby parser for the chordpro song file format.}
12
+ spec.description = %q{A ruby parser for the chordpro song file format.}
13
+ spec.homepage = "https://github.com/bkeepers/chordpro"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'parslet'
22
+
23
+ spec.add_development_dependency "bundler"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'guard-rspec'
27
+ end
@@ -0,0 +1,9 @@
1
+ require "chordpro/version"
2
+ require "chordpro/parser"
3
+ require "chordpro/html"
4
+
5
+ module Chordpro
6
+ def self.html(string)
7
+ HTML.new(Parser.new.parse(string)).to_s
8
+ end
9
+ end
@@ -0,0 +1,71 @@
1
+ require 'nokogiri'
2
+
3
+ module Chordpro
4
+ class HTML
5
+ def initialize(tree)
6
+ @song = tree[:song]
7
+ end
8
+
9
+ def to_s
10
+ @song.map { |e| elements(e) }.flatten.join("\n")
11
+ end
12
+
13
+ def elements(element)
14
+ element.map do |key, value|
15
+ send key, value
16
+ end
17
+ end
18
+
19
+ def directive(directive)
20
+ send directive[:name], directive if respond_to?(directive[:name])
21
+ end
22
+
23
+ def title(directive)
24
+ %Q|<h1 class="title">#{directive[:value]}</h1>|
25
+ end
26
+ alias_method :t, :title
27
+
28
+ def subtitle(directive)
29
+ %Q|<h2 class="subtitle">#{directive[:value]}</h2>|
30
+ end
31
+ alias_method :st, :subtitle
32
+ alias_method :su, :subtitle
33
+
34
+ def line(line)
35
+ chords = []
36
+ lyrics = []
37
+
38
+ line.each do |element|
39
+ if lyric = element[:lyric]
40
+ lyrics << lyric
41
+ elsif chord = element[:chord]
42
+ if chords[lyrics.size]
43
+ chord << chord
44
+ lyrics << nil
45
+ else
46
+ chords[lyrics.size] = chord
47
+ end
48
+ end
49
+ end
50
+
51
+ # ensure chords has same number of cells as lyrics
52
+ chords[lyrics.size - 1] ||= nil if lyrics.size > 0
53
+
54
+ %Q|<table><tr class="chords">#{
55
+ chords.map {|l| "<td>#{l}</td>" }.join
56
+ }</tr><tr>#{
57
+ lyrics.map {|l| "<td>#{l}</td>" }.join
58
+ }</tr></table>|
59
+ end
60
+
61
+ def newline(_)
62
+ '<br>'
63
+ end
64
+
65
+ def comment(directive)
66
+ %|<span class="comment">#{directive[:value]}</span>|
67
+ end
68
+ alias_method :c, :comment
69
+
70
+ end
71
+ end
@@ -0,0 +1,37 @@
1
+ require 'parslet'
2
+
3
+ module Chordpro
4
+ class Parser < Parslet::Parser
5
+ # Characters
6
+ rule(:space) { match('\s').repeat }
7
+ rule(:colon) { space >> str(':') >> space }
8
+ rule(:newline) { str("\n") }
9
+ rule(:lbrace) { str('{') }
10
+ rule(:rbrace) { str('}') }
11
+ rule(:lbracket) { str('[') }
12
+ rule(:rbracket) { str(']') }
13
+
14
+
15
+ rule(:identifier) { match['a-z'].repeat(1) }
16
+ rule(:value) { (rbrace.absent? >> any).repeat }
17
+
18
+ rule(:directive) do
19
+ (
20
+ lbrace >> space >>
21
+ identifier.as(:name) >>
22
+ (
23
+ space >> colon >> space >>
24
+ value.as(:value)
25
+ ).maybe >>
26
+ rbrace
27
+ ).as(:directive) >> newline.maybe
28
+ end
29
+ rule(:chord) { lbracket >> (rbracket.absent? >> any).repeat.as(:chord) >> rbracket }
30
+ rule(:lyric) { (lbracket.absent? >> newline.absent? >> any).repeat(1).as(:lyric) }
31
+ rule(:line) { (chord | lyric).repeat(1).as(:line) >> newline.maybe }
32
+
33
+ rule(:song) { (directive | newline.as(:newline) | line).repeat.as(:song) }
34
+
35
+ root(:song)
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Chordpro
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chordpro::HTML do
4
+ def html(string)
5
+ Chordpro::HTML.new(Chordpro::Parser.new.parse(string))
6
+ end
7
+
8
+ %w(title t).each do |name|
9
+ it "renders h1 for #{name}" do
10
+ expect(html("{#{name}: Blackbird}").to_s).to eq('<h1 class="title">Blackbird</h1>')
11
+ end
12
+ end
13
+
14
+ %w(subtitle st su).each do |name|
15
+ it "renders h2 for #{name}" do
16
+ expect(html("{#{name}:The Beatles}").to_s).to eq('<h2 class="subtitle">The Beatles</h2>')
17
+ end
18
+ end
19
+
20
+ it "renders line" do
21
+ 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>'
24
+ )
25
+ end
26
+
27
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+ require 'parslet/rig/rspec'
3
+
4
+ describe Chordpro::Parser do
5
+ let(:parser) { Chordpro::Parser.new }
6
+
7
+ subject { parser.send self.class.description }
8
+
9
+ describe 'space' do
10
+ it { should parse(' ') }
11
+ it { should parse(' ') }
12
+ it { should parse('') }
13
+ it { should_not parse('x') }
14
+ end
15
+
16
+ describe 'colon' do
17
+ it { should parse(':') }
18
+ it { should_not parse('x') }
19
+ end
20
+
21
+ describe 'newline' do
22
+ it { should parse("\n") }
23
+ it { should_not parse("x") }
24
+ end
25
+
26
+ describe 'lbrace' do
27
+ it { should parse("{") }
28
+ it { should_not parse("[") }
29
+ end
30
+
31
+ describe 'rbrace' do
32
+ it { should parse("}") }
33
+ it { should_not parse("]") }
34
+ end
35
+
36
+ describe 'lbracket' do
37
+ it { should parse("[") }
38
+ it { should_not parse("{") }
39
+ end
40
+
41
+ describe 'rbracket' do
42
+ it { should parse("]") }
43
+ it { should_not parse("}") }
44
+ end
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('') }
52
+ end
53
+
54
+ describe 'value' do
55
+ it { should parse('some value') }
56
+ it { should parse(' ahoy ').as(' ahoy ') }
57
+ it { should_not parse('oops}') }
58
+ end
59
+
60
+ describe 'directive' do
61
+ it { should parse('{title:Royals}').as(:directive => {:name => 'title', :value => 'Royals'}) }
62
+ # 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') }
66
+ end
67
+
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) }
71
+ end
72
+
73
+ it { should_not parse('[G') }
74
+ end
75
+
76
+ describe 'lyric' do
77
+ it { should parse("I've never seen") }
78
+ it { should parse(" a diamond in the ")}
79
+ it { should_not parse("in the[") }
80
+ it { should_not parse("in the\n") }
81
+ end
82
+
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"}]) }
94
+ it { should_not parse("foo\nbar") }
95
+ end
96
+
97
+ describe 'song' do
98
+ 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"}]}
105
+ ]})
106
+
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Examples' do
4
+ Dir[File.expand_path('../fixtures/*.crd', __FILE__)].each do |file|
5
+ name = File.basename(file)
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'))
11
+
12
+ expect(expected).to eq(actual)
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ body {
2
+ font-family: 'Helvetica Neue', 'Helvetica', sans-serif;
3
+ font-size: 13px;
4
+ padding: 20px;
5
+ }
6
+
7
+ .comment {
8
+ color: #999;
9
+ }
10
+
11
+ .chords {
12
+ font-weight: bold;
13
+ }
@@ -0,0 +1,27 @@
1
+ {title: You Are My Sunshine}
2
+
3
+ {c:Verse 1}
4
+ [G]The other night dear as I lay sleeping
5
+ [G7]I dreamed I [C]held you in my [G]arms
6
+ [G7]But when I a[C]woke dear I was mis[G]taken
7
+ So I hung my [D7]head and [G]cried
8
+
9
+ {c:Chorus}
10
+ {soc}
11
+ You are my sunshine my only sunshine
12
+ [G7]You make me [C]happy when skies are [G]gray
13
+ [G7]You'll never [C]know dear how much I [G]love you
14
+ Please don't take [D7]my sunshine a[G]way
15
+ {eoc}
16
+
17
+ {c:Verse 2}
18
+ I'll always love you and make you happy
19
+ [G7]If you will [C]only say the [G]same
20
+ [G7]But if you [C]leave me and love an[G]other
21
+ You'll regret [D7]it all some [G]day
22
+
23
+ {c:Verse 3}
24
+ You told me once dear you really loved me
25
+ [G7]And no one [C]else could come be[G]tween
26
+ [G7]But now you've [C]left me and love an[G]other
27
+ You have shattered [D7]all of my [G]dreams
@@ -0,0 +1,27 @@
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>
@@ -0,0 +1 @@
1
+ require 'chordpro'
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chordpro
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brandon Keepers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: parslet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: A ruby parser for the chordpro song file format.
84
+ email:
85
+ - brandon@opensoul.org
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - Guardfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - chordpro.gemspec
97
+ - lib/chordpro.rb
98
+ - lib/chordpro/html.rb
99
+ - lib/chordpro/parser.rb
100
+ - lib/chordpro/version.rb
101
+ - spec/chordpro/html_spec.rb
102
+ - spec/chordpro/parser_spec.rb
103
+ - spec/example_spec.rb
104
+ - spec/fixtures/example.css
105
+ - spec/fixtures/sunshine.crd
106
+ - spec/fixtures/sunshine.html
107
+ - spec/spec_helper.rb
108
+ homepage: https://github.com/bkeepers/chordpro
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.0.3
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: A ruby parser for the chordpro song file format.
132
+ test_files:
133
+ - spec/chordpro/html_spec.rb
134
+ - spec/chordpro/parser_spec.rb
135
+ - spec/example_spec.rb
136
+ - spec/fixtures/example.css
137
+ - spec/fixtures/sunshine.crd
138
+ - spec/fixtures/sunshine.html
139
+ - spec/spec_helper.rb