bakeConv 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: de0d62b2e4b4cb0a0d2031a14bd2d7b06c2e1021
4
+ data.tar.gz: 355d0d8980667abe73f3796a29f8984ae5182259
5
+ SHA512:
6
+ metadata.gz: f2bd923915408545869109aaa1474f3e31726b07ba1e0ee5c313d82fc69cd687ecfb455c6ca8e2fdcaee5ac3fb327089196a9672bc13a8c41247d042ed259c04
7
+ data.tar.gz: 85000592bd3b112b6648bbb87ccc588c9696d3a0d636d8eb2d43b202f5a749ca46b8e60474c1d0d00372b52f4a7d1d8d588e18e8396fb92336680a2384e6e8de
data/bin/bakeConv ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # BakeConverter
4
+ # Author: Frauke Blossey
5
+ # 12.03.2015
6
+
7
+ require_relative '../lib/bakeConverter'
data/doc/doc.html ADDED
@@ -0,0 +1,44 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Documentation of bakeConv</title>
5
+ <style type="text/css">
6
+ #rundrum {
7
+ border-width:1px;
8
+ border-style:dashed;
9
+ border-color:blue;
10
+ padding:0.2cm;
11
+ text-align:justify; }
12
+ </style>
13
+ </head>
14
+
15
+ <body>
16
+
17
+ <h1>bakeConv</h1>
18
+ bake converter is used to convert from bake to some other file, e.g. CMake file, which depends on your template file.
19
+
20
+ <h2>GuideLines</h2>
21
+ <h3>Concepts</h3>
22
+ <ul>
23
+ <li><a href="concepts/configfile.html">The configuration file Converter.config</a>
24
+ <li><a href="concepts/templatefile.html">The template file</a>
25
+ </ul>
26
+
27
+ <h3>Command Line</h3>
28
+ <ul>
29
+ <li><a href="cmd/install.html">How to install bake converter</a>
30
+ <li><a href="cmd/usecmd.html">How to use bake converter on command line</a>
31
+ </ul>
32
+
33
+ <h3>Further readings</h3>
34
+ <ul>
35
+ <li><a href="further/change.html">Changelog</a>
36
+ </ul>
37
+
38
+ <p>
39
+ <hr>
40
+ <table width="100%" border="0"><tr><td align="left">Described bakeConv version: 1.0.2</td><td align="right">June 11, 2015</td></tr></table>
41
+
42
+
43
+ </body>
44
+ </html>
data/lib/Bake.rb ADDED
@@ -0,0 +1,101 @@
1
+ # Class Bake
2
+ # Author: Frauke Blossey
3
+ # 24.03.2015
4
+
5
+ require_relative 'Converter'
6
+
7
+ module BConv
8
+
9
+ # class ParserException < Exception
10
+ # end
11
+
12
+ class Bake
13
+
14
+ #enums
15
+ START_INFO = 1
16
+ END_INFO = 2
17
+ BEFORE_INFO = 3
18
+ VAR = 4
19
+
20
+ def initialize(map, setMock, configFile)
21
+ @map = map
22
+ @setMock = setMock
23
+ @configFile = configFile
24
+ end
25
+
26
+ def run
27
+ bakeLines = ''
28
+ cmd = @setMock ? ['ruby','C:/_dev/projects/bakeMock/bakeMock/bakeMock.rb'] : ['bake']
29
+ cmd << '-b' << @map['BuildConfig']
30
+ cmd << '-m' << @map['MainProj']
31
+ cmd << '-p' << @map['Proj2Convert']
32
+ cmd << '--conversion_info'
33
+ Util.strToArray('Workspace', @map).each { |w| cmd << '-w' << w }
34
+
35
+ Dir.chdir(File.dirname(@configFile)) do
36
+ bakeLines = `#{cmd.join(' ')}`
37
+ end
38
+
39
+ abort "Error while trying to call bake!" unless $?.success?
40
+ return bakeLines
41
+ end
42
+
43
+ def getHash(bakeLines)
44
+ b_hash = {}
45
+ key = ""
46
+ value = []
47
+ state = Bake::BEFORE_INFO
48
+
49
+ bakeLines.each_line do |line|
50
+ if line.start_with?(" ") && line[2] != " "
51
+ if state == Bake::VAR
52
+ value << line.strip if value != nil
53
+ value = line.strip if value == nil
54
+ b_hash.store(key,value)
55
+
56
+ end
57
+ elsif line.start_with?(" ") && line[1] != " "
58
+ if state == Bake::START_INFO || state == Bake::VAR
59
+ key = ""
60
+ value = []
61
+ key = line.strip
62
+ b_hash.store(key,value)
63
+
64
+ # if key != "BAKE_INCLUDES" && key != "BAKE_SOURCES" && key != "BAKE_DEFINES"
65
+ # state = Bake::START_INFO
66
+ # else
67
+ state = VAR
68
+ #end
69
+ end
70
+ #elsif line.start_with?("") && !line.match("START_INFO") && !line.match("END_INFO")
71
+ # puts "Error: Nothing else than START_INFO and END_INFO starting without blanks!"
72
+ else
73
+ if line.match("START_INFO") && line[0] != " "
74
+ # if state != Bake::BEFORE_INFO
75
+ # abort "Error!"
76
+ # end
77
+ state = Bake::START_INFO
78
+ elsif line.match("END_INFO")
79
+ state = Bake::END_INFO
80
+ end
81
+ end
82
+ end
83
+
84
+ if state != Bake::END_INFO
85
+ puts "Error: There is a problem with END_INFO. No output file could be generated!"
86
+ return nil
87
+ #raise ParseException.new("END_INFO missing")
88
+ end
89
+
90
+ # begin
91
+ # ...
92
+ # rescue ParseException
93
+ # exit(-1)
94
+ # end
95
+
96
+ return b_hash
97
+ end
98
+
99
+ end
100
+
101
+ end
@@ -0,0 +1,86 @@
1
+ # Class ConfigParser
2
+ # Author: Frauke Blossey
3
+ # 23.03.2015
4
+
5
+ module BConv
6
+
7
+ class ConfigParser
8
+
9
+ def initialize(filename, projToConvert)
10
+ @filename = filename
11
+ @projToConvert = projToConvert
12
+ end
13
+
14
+ def readConfig
15
+ begin
16
+ File.open(@filename) do |l|
17
+ mappings = []
18
+ mapForProj = {}
19
+ while(line = l.gets) != nil
20
+ mapping = {}
21
+ ar = []
22
+ setEndLabel = false
23
+ if line.match(/^Mapping/)
24
+ lineNumber = l.lineno
25
+ while(line = l.gets) != nil
26
+ line.gsub!('\\','/')
27
+ ar = line.split("=")
28
+ if (ar.length == 2)
29
+ comPos = ar[1].index("#")
30
+ ar[1] = ar[1][0..comPos-1] if comPos != nil
31
+ mapping.store(ar[0].strip,ar[1].strip)
32
+ elsif ar[1] == ""
33
+ mapping.store(ar[0].strip,"")
34
+ end
35
+
36
+ if line.match(/^}$/)
37
+ raise "Error: Workspace parameter from Mapping in line #{lineNumber} is missing!" if mapping.has_key?('Workspace') == false
38
+ raise "Error: MainProj parameter from Mapping in line #{lineNumber} is missing!" if mapping.has_key?('MainProj') == false
39
+ raise "Error: BuildConfig parameter from Mapping in line #{lineNumber} is missing!" if mapping.has_key?('BuildConfig') == false
40
+ raise "Error: Proj2Convert parameter from Mapping in line #{lineNumber} is missing!" if mapping.has_key?('Proj2Convert') == false
41
+ raise "Error: OutputFileName parameter from Mapping in line #{lineNumber} is missing!" if mapping.has_key?('OutputFileName') == false
42
+ raise "Error: TemplateFile parameter from Mapping in line #{lineNumber} is missing!" if mapping.has_key?('TemplateFile') == false
43
+
44
+ if @projToConvert != "" && @projToConvert != mapping['Proj2Convert']
45
+ mapping = {}
46
+ else
47
+ mappings << mapping
48
+ end
49
+
50
+ # if @projToConvert.length != 0
51
+ # @projToConvert.each do |val|
52
+ # if val == mapping['Proj2Convert']
53
+ # mappings << mapping
54
+ # end
55
+ # end
56
+ # else
57
+ # mappings << mapping
58
+ # end
59
+
60
+ setEndLabel = true
61
+ break
62
+ elsif line.include?("Mapping")
63
+ raise "Error: end label } from Mapping in line #{lineNumber} is missing!"
64
+ end
65
+ end
66
+ raise "Error: end label } from Mapping in line #{lineNumber} is missing!" if setEndLabel == false
67
+ elsif line.match(/^( *)Workspace/)
68
+ lineNumber = l.lineno
69
+ raise "Error: Mapping keyword in front of line #{lineNumber} is missing?"
70
+ end
71
+ end
72
+ return mappings
73
+ end
74
+ rescue Exception => e
75
+ puts e.message
76
+ #puts e.back_trace #for debug mode
77
+ abort
78
+ end
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+
85
+
86
+
data/lib/Converter.rb ADDED
@@ -0,0 +1,123 @@
1
+ # Class Converter
2
+ # Author: Frauke Blossey
3
+ # 24.03.2015
4
+
5
+ require_relative 'Util'
6
+
7
+ module BConv
8
+
9
+ class Converter
10
+
11
+ def initialize(map, configFile)
12
+ @configFile = configFile
13
+ @map = map
14
+ end
15
+
16
+ def convert
17
+ outputfilename = Util.makeAbsolute(@map['OutputFileName'], @configFile)
18
+ templatefilename = Util.makeAbsolute(@map['TemplateFile'], @configFile)
19
+
20
+ lineIdx = 0
21
+ tmpLineIdx = 0
22
+ set = true
23
+ begin
24
+ File.open(outputfilename, 'w') do |fout|
25
+ File.open(templatefilename) do |fread|
26
+ File.readlines(fread).each do |line|
27
+ lineIdx += 1
28
+ wroteLine = false
29
+ @map.keys.each do |key|
30
+
31
+ if line.include?(key.to_s) && @map[key].include?(".txt")
32
+ preAndPostfix = line.scan(/(.*)\$\$\(#{key}\)(.*)/)
33
+ if preAndPostfix.length == 1
34
+ prefix = preAndPostfix[0][0]
35
+ postfix = preAndPostfix[0][1]
36
+ end
37
+
38
+ filename = Util.makeAbsolute(@map[key], @configFile)
39
+ raise "Error: Template file #{File.basename(filename)} is empty!" if File.zero?(filename)
40
+ raise "Error: File #{File.basename(filename)} does not exist!" if !File.exist?(filename)
41
+
42
+ File.open(filename) do |fr|
43
+ File.readlines(fr).each do |l|
44
+ tmpLineIdx += 1
45
+ @map.keys.each do |k|
46
+ wroteLine = findAndReplace(k, l, fout, prefix, postfix)
47
+ break if wroteLine == true
48
+ end
49
+ if wroteLine == false
50
+ l.strip!
51
+ l = prefix + l + postfix + "\n"
52
+ m = l.match(/\$\$\((.*)\)/)
53
+ if m
54
+ puts "Info: Key $$(#{m[1]}) in #{File.basename(filename)}, line #{tmpLineIdx.to_s} wasn\'t replaced!" if m
55
+ end
56
+ puts l
57
+ fout.write(l)
58
+ set = false
59
+ end
60
+ end
61
+ end
62
+ elsif (@map[key][0] == "[") && (@map[key][-1] == "]")
63
+ @map.store(key,Util.strToArray(key, @map))
64
+ wroteLine = findAndReplace(key, line, fout, "", "")
65
+ break
66
+ elsif line.match(/#{key.to_s}/)
67
+ wroteLine = findAndReplace(key, line, fout, "", "")
68
+ break
69
+ end
70
+ end
71
+
72
+ if wroteLine == false
73
+ if set == true
74
+ m = line.match(/\$\$\((.*)\)/)
75
+ if m
76
+ puts "Info: Key $$(#{m[1]}) in #{File.basename(templatefilename)}, line #{lineIdx.to_s} wasn\'t replaced!"
77
+ end
78
+ fout.write(line)
79
+ end
80
+ set = true
81
+ end
82
+ end
83
+ end
84
+ end
85
+ raise "Error: Output file #{File.basename(outputfilename)} is empty!" if File.zero?(outputfilename)
86
+ raise "Error: Template file #{File.basename(templatefilename)} is empty!" if File.zero?(templatefilename)
87
+ rescue Exception => e
88
+ puts e.message
89
+ puts e.backtrace
90
+ abort
91
+ end
92
+ end
93
+
94
+ def findAndReplace(key, line, fout, prefix, postfix)
95
+ wroteLine = false
96
+ found = line.scan(/(.*)\$\$\(#{key}\)(.*)/)
97
+
98
+ if found.length == 1
99
+ pre = found[0][0]
100
+ post = found[0][1]
101
+
102
+ if @map[key].kind_of?(Array)
103
+ @map[key].each do |val|
104
+ line = prefix + pre + val.to_s + post + postfix + "\n"
105
+ fout.write(line)
106
+ end
107
+ wroteLine = true
108
+ else
109
+ line = prefix + pre + @map[key] + post + postfix + "\n"
110
+ fout.write(line)
111
+ wroteLine = true
112
+ end
113
+ elsif line.include?("/\$\$\(#{key}\)/") && found.length == 0
114
+ line.gsub!(/\$\$\(#{key}\)/, @map[key].to_s)
115
+ fout.write(line)
116
+ wroteLine = true
117
+ end
118
+ return wroteLine
119
+ end
120
+
121
+ end
122
+
123
+ end
data/lib/File_ext.rb ADDED
@@ -0,0 +1,11 @@
1
+ # Class File (extended with 'isAbsolute' method)
2
+ # Author: Frauke Blossey
3
+ # 14.04.2015
4
+
5
+ class File
6
+
7
+ def self.isAbsolute?(filename)
8
+ File.expand_path(filename) == filename
9
+ end
10
+
11
+ end
data/lib/Help.rb ADDED
@@ -0,0 +1,22 @@
1
+ module BConv
2
+
3
+ require_relative 'Version'
4
+
5
+ class Help
6
+
7
+ def self.printHelp
8
+
9
+ puts "bakeConv #{BConv::Version.number}\n\n"
10
+ puts "Usage: bakeConv [options]"
11
+ puts "-f, --file <configFile> Config name for your conversion."
12
+ puts "[-p, --project] <projName> Project to convert (default are all projects mentioned in the config file).\n\n"
13
+ puts "-v, --version Print version."
14
+ puts "-h, --help Print this help."
15
+ puts "--show_doc Open documentation."
16
+ puts "--show_license Print the license."
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
data/lib/Util.rb ADDED
@@ -0,0 +1,21 @@
1
+ # Class Util (contains utility methods)
2
+ # Author: Frauke Blossey
3
+ # 15.04.2015
4
+
5
+ require_relative 'File_ext'
6
+
7
+ class Util
8
+
9
+ def self.makeAbsolute(file, configFile)
10
+ if File.isAbsolute?(file)
11
+ outputfilename = file
12
+ else
13
+ outputfilename = File.dirname(configFile) + "/" + file
14
+ end
15
+ end
16
+
17
+ def self.strToArray(key, map)
18
+ map[key][1..-2].split(",").map {|elem| elem.strip}
19
+ end
20
+
21
+ end
data/lib/Version.rb ADDED
@@ -0,0 +1,9 @@
1
+ module BConv
2
+
3
+ class Version
4
+ def self.number
5
+ "1.1.1"
6
+ end
7
+ end
8
+
9
+ end
@@ -0,0 +1,146 @@
1
+ # BakeConverter
2
+ # Author: Frauke Blossey
3
+ # 12.03.2015
4
+
5
+ require 'rubygems'
6
+ require 'launchy'
7
+ require_relative 'ConfigParser'
8
+ require_relative 'Bake'
9
+ require_relative 'Converter'
10
+ require_relative 'Version'
11
+ require_relative 'Help'
12
+
13
+ def main
14
+ #-------------------------------------------------------
15
+ # Get command line arguments:
16
+ #-------------------------------------------------------
17
+ converterConfigFile = ""
18
+ projToConvert = ""
19
+ setMock = false
20
+
21
+ begin
22
+ args = ARGV.select.each_with_index{|str, i| i.even? && str[0] == "-"}
23
+ opts = ARGV.select.each_with_index{|str, i| i.odd? && str[0] != "-"}
24
+
25
+ #puts Hash[(args.zip opts)]
26
+
27
+ if ARGV[0] != "--help" && ARGV[0] != "-h" && ARGV[0] != "--show_doc" && ARGV[0] != "--version" && ARGV[0] != "-v" && ARGV[0] != "--show_license" && ARGV[0] != "--mock"
28
+ if (!ARGV.include?("-f") && !ARGV.include?("--file")) && ARGV.length != 0
29
+ puts "Error: \'-f\' is missing! (try --help)"
30
+ exit(-1)
31
+ end
32
+ end
33
+
34
+ if ARGV.length == 1 && ARGV[0] != "--help" && ARGV[0] != "-h" && ARGV[0] != "--show_doc" && ARGV[0] != "--version" && ARGV[0] != "-v" && ARGV[0] != "--show_license" && ARGV[0] != "--mock"
35
+ puts "Error: Too less arguments! (try --help)"
36
+ puts "Config file is missing!" if opts[0] == nil
37
+ exit(-1)
38
+ elsif ARGV.length == 0 || (ARGV.length == 1 && ARGV[0] == "--mock")
39
+ puts "Error: Too less arguments! (try --help)"
40
+ exit(-1)
41
+ end
42
+
43
+ Hash[(args.zip opts)].each do |k,v|
44
+ case k
45
+ when "-f"
46
+ converterConfigFile = v
47
+ abort "Error: Config file is missing!" if converterConfigFile == nil
48
+ when "--file"
49
+ converterConfigFile = v
50
+ abort "Error: Config file is missing!" if converterConfigFile == nil
51
+ when "-p"
52
+ projToConvert = v
53
+ abort "Error: project is missing!" if projToConvert == nil
54
+ when "--project"
55
+ projToConvert = v
56
+ abort "Error: project is missing!" if projToConvert == nil
57
+ when "--mock"
58
+ setMock = true
59
+ when "--version"
60
+ puts "bakeConverter #{BConv::Version.number}"
61
+ exit(0)
62
+ when "-v"
63
+ puts "bakeConverter #{BConv::Version.number}"
64
+ exit(0)
65
+ when "--help"
66
+ BConv::Help.printHelp
67
+ exit(0)
68
+ when "-h"
69
+ BConv::Help.printHelp
70
+ exit(0)
71
+ when "--show_doc"
72
+ Launchy.open(File.expand_path("../doc/doc.html", File.dirname(__FILE__)))
73
+ exit(0)
74
+ when "--show_license"
75
+ puts
76
+ File.open(File.expand_path("../license.txt", File.dirname(__FILE__))) do |l|
77
+ while(line = l.gets) != nil
78
+ puts line
79
+ end
80
+ end
81
+ exit(0)
82
+ else
83
+ puts "Error: don't know '#{k}'! (try --help)"
84
+ exit(-1)
85
+ end
86
+ end
87
+
88
+ rescue => e
89
+ puts "Error in arguments!"
90
+ #puts e.to_s #for debug mode
91
+ exit(-1)
92
+ end
93
+
94
+ configFile = converterConfigFile.gsub('\\','/')
95
+
96
+ #-------------------------------------------------------
97
+ # Starting converting process:
98
+ #-------------------------------------------------------
99
+ cp = BConv::ConfigParser.new(configFile, projToConvert)
100
+
101
+ puts "Reading config..."
102
+ mappings = cp.readConfig
103
+
104
+ abort "Error: Config file is empty OR the requested project(s) is commented out!" if mappings.length == 0
105
+ puts "Converting #{mappings.length} projects..."
106
+
107
+ idxCnt = 0
108
+
109
+ mappings.each do |map|
110
+ idxCnt += 1
111
+ puts "Convert #{idxCnt} from #{mappings.length}: #{map['Proj2Convert']} (#{map['BuildConfig']})"
112
+ puts "Call Bake..."
113
+ bake = BConv::Bake.new(map, setMock, configFile)
114
+ bakeLines = bake.run
115
+ bhash = bake.getHash(bakeLines)
116
+ if bhash != nil
117
+ bhash.each {|k,v| map[k] = v unless map.has_key?k}
118
+ #map.merge!(bhash)
119
+ conv = BConv::Converter.new(map, configFile)
120
+ puts "Convert..."
121
+ conv.convert
122
+ end
123
+ end
124
+
125
+ puts "Done"
126
+ end
127
+
128
+ #-------------------------------------------------------
129
+ # Call the bakeConverter:
130
+ #-------------------------------------------------------
131
+ main
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
data/license.txt ADDED
@@ -0,0 +1,21 @@
1
+ bakeConverter License:
2
+
3
+ Copyright (c) 2015 E.S.R. Labs AG
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bakeConv
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Frauke Blossey
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: launchy
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.4.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.4.3
27
+ description: bake converter is used to convert from bake to some other file, e.g.
28
+ CMake file, which depends on your template file.
29
+ email: frauke.blossey@esrlabs.com
30
+ executables:
31
+ - bakeConv
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - lib/Bake.rb
36
+ - lib/ConfigParser.rb
37
+ - lib/Converter.rb
38
+ - lib/File_ext.rb
39
+ - lib/Help.rb
40
+ - lib/Util.rb
41
+ - lib/Version.rb
42
+ - lib/bakeConverter.rb
43
+ - doc/doc.html
44
+ - license.txt
45
+ - bin/bakeConv
46
+ homepage:
47
+ licenses:
48
+ - MIT
49
+ metadata: {}
50
+ post_install_message:
51
+ rdoc_options:
52
+ - -x
53
+ - doc
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '1.9'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project:
68
+ rubygems_version: 2.0.15
69
+ signing_key:
70
+ specification_version: 4
71
+ summary: tbd
72
+ test_files: []