buildlogparser 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 849b9a478c2b1ca8fef07c1c69f206228a000529
4
+ data.tar.gz: c7392cdde7bf9e63177104e85cc04d2ac992f1cf
5
+ SHA512:
6
+ metadata.gz: fc3679e532cc26b9e6dc4bf7489f4e6393c77bb0583bf5706ff3922dfca3e561a7c8f23f428c11eac8c22c9815a94353f515be546da8de84d9bb558923423397
7
+ data.tar.gz: bc50f3040d3beaaa33260c194d889755118876bfaeebaf4d9cb8759104fed548e7ab37b3a3beed6581ec9dcf96350ff70eb31aff8f48e8b193b454df5e576ef6
@@ -0,0 +1,22 @@
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
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
@@ -0,0 +1,9 @@
1
+ dist: trusty
2
+ sudo: false
3
+
4
+ language: ruby
5
+
6
+ cache: bundler
7
+
8
+ rvm:
9
+ - 2.3
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2017 Mario Werner
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,11 @@
1
+ [![Build Status](https://travis-ci.org/niosHD/buildlogparser.svg?branch=develop)](https://travis-ci.org/niosHD/buildlogparser)
2
+ [![codecov](https://codecov.io/gh/niosHD/buildlogparser/branch/develop/graph/badge.svg)](https://codecov.io/gh/niosHD/buildlogparser)
3
+
4
+ # buildlogparser Gem
5
+
6
+ Collection of various parsers for the extraction of information from build and execution logs.
7
+
8
+ ## Tested Program Versions
9
+
10
+ * cmake/ctest 3.5.1
11
+ * size (GNU Binutils 2.26.1)
@@ -0,0 +1,10 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new(:test) do |t|
4
+ t.libs << "test"
5
+ t.libs << "lib"
6
+ t.test_files = FileList["test/**/test_*.rb"]
7
+ end
8
+
9
+ desc "Run tests"
10
+ task :default => :test
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'buildlogparser/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "buildlogparser"
8
+ spec.version = BuildLogParser::VERSION::STRING
9
+ spec.authors = ["Mario Werner"]
10
+ spec.email = ["mario.werner@iaik.tugraz.at"]
11
+ spec.summary = "Collection of various parsers for the extraction of information from build and execution logs."
12
+ spec.homepage = "https://github.com/niosHD/buildlogparser"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+ spec.bindir = "bin"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.15"
24
+ spec.add_development_dependency "codecov", "~> 0.1.10"
25
+ spec.add_development_dependency "minitest", "~> 5.8"
26
+ spec.add_development_dependency "rake", "~> 10.5"
27
+ spec.add_development_dependency "simplecov", "~> 0.14"
28
+ spec.add_runtime_dependency "parslet", "~> 1.8"
29
+ end
@@ -0,0 +1,6 @@
1
+ require "buildlogparser/parser"
2
+ require "buildlogparser/parsers/cmake"
3
+ require "buildlogparser/parsers/ctest"
4
+ require "buildlogparser/parsers/size"
5
+
6
+ require "buildlogparser/version"
@@ -0,0 +1,13 @@
1
+ module BuildLogParser
2
+ class Parser
3
+ attr_reader :logtext
4
+
5
+ def initialize()
6
+ reset()
7
+ end
8
+
9
+ def reset()
10
+ @logtext = nil
11
+ end
12
+ end # class Parser
13
+ end # module BuildLogParser
@@ -0,0 +1,80 @@
1
+ require 'parslet'
2
+
3
+ module BuildLogParser
4
+ module CMakeMakefileStdout
5
+ class Parser < Parslet::Parser
6
+ rule(:space) { match['\s'] }
7
+ rule(:space?) { space.repeat }
8
+
9
+ rule(:newline) { str("\r").maybe >> str("\n") }
10
+ rule(:restofline){ ( newline.absent? >> any ).repeat }
11
+
12
+ rule(:path) { match['[:alnum:]0-9=\+\.\-_/'].repeat(1) }
13
+ rule(:integer) { match['0-9'].repeat(1) }
14
+
15
+ rule(:percentage) { str("[") >> space? >> integer.as(:percentage) >> str("%]") }
16
+ rule(:language) { match['[:alnum:]'].repeat(1).as(:language) }
17
+ rule(:targettype) do
18
+ str("executable").as(:targettype) |
19
+ (str("static").as(:targettype) >> str(" library")) |
20
+ (str("shared").as(:targettype) >> str(" library")) |
21
+ str("object").as(:targettype)
22
+ end
23
+ rule(:operation) { (str("Building") | str("Linking")).as(:operation) }
24
+
25
+ rule(:progressline) do
26
+ percentage >> space? >> operation >> space? >> language >> space? >> targettype >> space? >> path.as(:path) >> newline
27
+ end
28
+ rule(:scanningline) do
29
+ str('Scanning dependencies of target ') >> path >> newline
30
+ end
31
+ rule(:targetendline) do
32
+ percentage >> space? >> str("Built target") >> space? >> path.as(:target) >> newline
33
+ end
34
+
35
+ rule(:outputend) { progressline | targetendline }
36
+ rule(:output) { ( outputend.absent? >> any ).repeat.as(:output) }
37
+
38
+ rule(:target) do
39
+ scanningline.maybe >>
40
+ (progressline >> output).repeat.as(:events) >>
41
+ targetendline.as(:targetend)
42
+ end
43
+
44
+ rule(:start) { (target | (restofline >> newline).as(:drop)).repeat.as(:array) }
45
+ root(:start)
46
+ end # class Parser
47
+
48
+ class Transform < Parslet::Transform
49
+ rule(:drop => subtree(:tree)) { }
50
+ rule(:events => subtree(:events), :targetend => subtree(:targetend)) do
51
+ { :events => events, :name => String(targetend[:target])}
52
+ end
53
+ rule(:percentage => simple(:percentage), :operation => simple(:operation), :language => simple(:language), :targettype => simple(:targettype), :path => simple(:path), :output => subtree(:output)) do
54
+ op = String(operation).downcase.to_sym
55
+ lang = String(language).downcase.to_sym
56
+ outputstr = String(output)
57
+ outputstr = "" if output.is_a?(Array) and output.size() == 0
58
+ {:percentage => Integer(percentage), :operation => op, :language => lang, :targettype => targettype.to_sym, :path => String(path), :output => outputstr}
59
+ end
60
+ rule(:array => subtree(:tree)) { tree.compact.flatten }
61
+ end # class Transform
62
+ end # module CMakeMakefileStdout
63
+
64
+ class CMakeParser < BuildLogParser::Parser
65
+ attr_reader :targets
66
+
67
+ def reset()
68
+ super()
69
+ @targets = []
70
+ end
71
+
72
+ def parseMakefileStdout(logtext)
73
+ reset()
74
+ @logtext = logtext
75
+ parser = CMakeMakefileStdout::Parser.new
76
+ tree = parser.parse(logtext)
77
+ @targets = CMakeMakefileStdout::Transform.new.apply(tree)
78
+ end
79
+ end # class CMakeParser
80
+ end # module BuildLogParser
@@ -0,0 +1,133 @@
1
+ require 'parslet'
2
+
3
+ module BuildLogParser
4
+ module CTestStdout
5
+ class Parser < Parslet::Parser
6
+ rule(:space) { match['\s'] }
7
+ rule(:space?) { space.repeat }
8
+
9
+ rule(:newline) { str("\r").maybe >> str("\n") }
10
+ rule(:anyline) do
11
+ ( newline.absent? >> any ).repeat >> newline |
12
+ ( newline.absent? >> any ).repeat(1)
13
+ end
14
+
15
+ rule(:letters) { match['[:alnum:]\+\.\-_'].repeat(1) }
16
+ rule(:integer) { match['0-9'].repeat(1) }
17
+ rule(:float) { integer >> (match['\.,'] >> integer).maybe }
18
+
19
+ rule(:event) do
20
+ space? >> integer.as(:nr) >> str('/') >> integer.as(:total_nr) >> space? >> str('Test') >> space? >> str('#') >>
21
+ integer >> str(': ') >> letters.as(:name) >> match['\.*\s'].repeat(1) >> letters.as(:result) >> space? >>
22
+ float.as(:time_sec) >> anyline
23
+ end
24
+
25
+ rule(:start) { (event | anyline.as(:drop)).repeat.as(:array) }
26
+ root(:start)
27
+ end # class Parser
28
+
29
+ class Transform < Parslet::Transform
30
+ rule(:drop => subtree(:tree)) { }
31
+ rule(:nr => simple(:nr), :total_nr => simple(:total_nr), :name => simple(:name), :result => simple(:result), :time_sec => simple(:time_sec) ) do
32
+ { :nr => Integer(nr), :total_nr => Integer(total_nr), :name => String(name), :result => String(result).downcase!.to_sym, :time_sec => Float(time_sec) }
33
+ end
34
+ rule(:array => subtree(:tree)) { tree.is_a?(Array) ? tree.compact : [ tree ] }
35
+ end # class Transform
36
+ end # module CTestStdout
37
+
38
+ module CTestLog
39
+ class Parser < Parslet::Parser
40
+ rule(:space) { match('\s').repeat(1) }
41
+ rule(:space?) { space.maybe }
42
+
43
+ rule(:newline) { str("\r").maybe >> str("\n") }
44
+ rule(:restofline){ ( newline.absent? >> any ).repeat }
45
+ rule(:anyline) do
46
+ restofline >> newline |
47
+ ( newline.absent? >> any ).repeat(1)
48
+ end
49
+
50
+ rule(:letters) { match['[:alnum:]'].repeat(1) }
51
+ rule(:path) { match['[:alnum:]0-9=\+\.\-_/'].repeat(1) }
52
+ rule(:integer) { match['0-9'].repeat(1) }
53
+ rule(:float) { integer >> (match['\.,'] >> integer).maybe }
54
+
55
+ rule(:endofoutput) { newline.maybe >> str('<end of output>') >> newline }
56
+ rule(:output) { ( endofoutput.absent? >> any ).repeat }
57
+ rule(:endtime) { str('end time: ') >> restofline.as(:endtime) }
58
+
59
+ rule(:quotedcommand) { str('"') >> path.as(:commandstring) >> str('"') }
60
+ rule(:commandlist) { quotedcommand >> (space >> quotedcommand).repeat }
61
+
62
+ rule(:event) do
63
+ integer.as(:nr) >> str('/') >> integer.as(:total_nr) >> str(' Test: ') >> path.as(:name) >> newline >>
64
+ str('Command: ') >> commandlist.as(:command) >> newline >>
65
+ str('Directory: ') >> path.as(:directory) >> newline >>
66
+ str('"') >> path >> str('" start time: ') >> restofline.as(:starttime) >> newline >>
67
+ str('Output:') >> newline >>
68
+ str('----------------------------------------------------------') >> newline >>
69
+ output.as(:output) >>
70
+ endofoutput >>
71
+ str('Test time =')>> space? >> float.as(:time_sec) >> str(' sec') >> newline >>
72
+ str('----------------------------------------------------------') >> newline >>
73
+ str('Test ') >> letters.as(:result) >>
74
+ ( endtime.absent? >> any ).repeat >> endtime >> newline >>
75
+ str('"') >> path >> str('" time elapsed: ') >> restofline.as(:time) >> newline >>
76
+ str('----------------------------------------------------------') >> newline
77
+ end
78
+
79
+ rule(:start) { (event | anyline.as(:drop)).repeat.as(:array) }
80
+ root(:start)
81
+ end # class Parser
82
+
83
+ class Transform < Parslet::Transform
84
+ rule(:drop => subtree(:tree)) { }
85
+ rule(:nr => simple(:nr), :total_nr => simple(:total_nr), :name => simple(:name), :command => subtree(:command), :directory => simple(:directory), :starttime => simple(:starttime), :output => subtree(:output), :time_sec => simple(:time_sec), :result => simple(:result), :endtime => simple(:endtime), :time => simple(:time) ) do
86
+ result_symb = :failed
87
+ result_symb = :passed if result == 'Pass' || result == 'Passed'
88
+ outputstr = String(output)
89
+ outputstr = "" if output.is_a?(Array) and output.size() == 0
90
+ commandarray = command
91
+ commandarray = [ command ] if not command.is_a?(Array)
92
+ { :nr => Integer(nr), :total_nr => Integer(total_nr), :name => String(name), :command => commandarray, :directory => String(directory), :starttime => String(starttime), :output => outputstr, :time_sec => Float(time_sec), :result => result_symb, :endtime => String(endtime), :time => String(time) }
93
+ end
94
+ rule(:commandstring => simple(:commandstring)) { String(commandstring) }
95
+ rule(:array => subtree(:tree)) { tree.is_a?(Array) ? tree.compact : [ tree ] }
96
+ end # class Transform
97
+ end # module CTestLog
98
+
99
+ class CTestParser < BuildLogParser::Parser
100
+ attr_reader :data
101
+ attr_reader :errors
102
+
103
+ def reset()
104
+ super()
105
+ @data = []
106
+ @errors = 0
107
+ end
108
+
109
+ def parseStdout(logtext)
110
+ reset()
111
+ @logtext = logtext
112
+ parser = CTestStdout::Parser.new
113
+ tree = parser.parse(logtext)
114
+ @data = CTestStdout::Transform.new.apply(tree)
115
+
116
+ @data.each do |event|
117
+ @errors += 1 unless event[:result] == :passed
118
+ end
119
+ end
120
+
121
+ def parseLog(logtext)
122
+ reset()
123
+ @logtext = logtext
124
+ parser = CTestLog::Parser.new
125
+ tree = parser.parse(logtext)
126
+ @data = CTestLog::Transform.new.apply(tree)
127
+
128
+ @data.each do |event|
129
+ @errors += 1 unless event[:result] == :passed
130
+ end
131
+ end
132
+ end # class CTestParser
133
+ end # module BuildLogParser
@@ -0,0 +1,57 @@
1
+ require 'parslet'
2
+
3
+ module BuildLogParser
4
+ module SizeBerkeleyStdout
5
+ class Parser < Parslet::Parser
6
+ rule(:space) { match['\s'] }
7
+ rule(:space?) { space.repeat }
8
+
9
+ rule(:newline) { str("\r").maybe >> str("\n") }
10
+ rule(:restofline){ ( newline.absent? >> any ).repeat }
11
+
12
+ rule(:path) { match['[:alnum:]0-9=\+\.\-_/'].repeat(1) }
13
+ rule(:integer) { match['0-9'].repeat(1) }
14
+ rule(:hexnumber) { match['a-fA-F0-9'].repeat(1) }
15
+
16
+ rule(:header) do
17
+ space? >> str('text') >> space? >> str('data') >> space? >>
18
+ str('bss') >> space? >> str('dec') >> space? >> str('hex') >>
19
+ space? >> str('filename') >> newline
20
+ end
21
+
22
+ rule(:event) do
23
+ space? >> integer.as(:text) >> space? >> integer.as(:data) >> space? >>
24
+ integer.as(:bss) >> space? >> integer.as(:dec) >> space? >>
25
+ hexnumber.as(:hex) >> space? >> path.as(:filename) >> newline
26
+ end
27
+
28
+ rule(:start) { ((header >> event.repeat(1)).as(:array) | (restofline >> newline).as(:drop)).repeat.as(:array) }
29
+ root(:start)
30
+ end # class Parser
31
+
32
+ class Transform < Parslet::Transform
33
+ rule(:drop => subtree(:tree)) { }
34
+ rule(:text => simple(:text), :data => simple(:data), :bss => simple(:bss), :dec => simple(:dec), :hex => simple(:hex), :filename => simple(:filename)) do
35
+ { :text => Integer(text), :data => Integer(data), :bss => Integer(bss), :total => Integer(dec), :filename => String(filename) }
36
+ end
37
+ rule(:array => subtree(:tree)) { tree.compact.flatten }
38
+ end # class Transform
39
+ end # module SizeBerkeleyStdout
40
+
41
+ class SizeParser < BuildLogParser::Parser
42
+ attr_reader :data
43
+
44
+ def reset()
45
+ super()
46
+ @data = []
47
+ end
48
+
49
+ def parseBerkeleyStdout(logtext)
50
+ reset()
51
+ @logtext = logtext
52
+ parser = SizeBerkeleyStdout::Parser.new
53
+ tree = parser.parse(logtext)
54
+ @data = SizeBerkeleyStdout::Transform.new.apply(tree)
55
+ end
56
+ end # class SizeParser
57
+ end # module BuildLogParser
@@ -0,0 +1,9 @@
1
+ module BuildLogParser
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 0
6
+
7
+ STRING = [MAJOR, MINOR, PATCH].join('.')
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buildlogparser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mario Werner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: codecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.10
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.10
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.14'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.14'
83
+ - !ruby/object:Gem::Dependency
84
+ name: parslet
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.8'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.8'
97
+ description:
98
+ email:
99
+ - mario.werner@iaik.tugraz.at
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - buildlogparser.gemspec
111
+ - lib/buildlogparser.rb
112
+ - lib/buildlogparser/parser.rb
113
+ - lib/buildlogparser/parsers/cmake.rb
114
+ - lib/buildlogparser/parsers/ctest.rb
115
+ - lib/buildlogparser/parsers/size.rb
116
+ - lib/buildlogparser/version.rb
117
+ homepage: https://github.com/niosHD/buildlogparser
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 2.5.1
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: Collection of various parsers for the extraction of information from build
141
+ and execution logs.
142
+ test_files: []