hw_checker 1.3.43
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 +15 -0
- data/bin/hw_checker +7 -0
- data/lib/hw_checker/base.rb +29 -0
- data/lib/hw_checker/file_scan.rb +33 -0
- data/lib/hw_checker/python_stat.rb +24 -0
- data/lib/hw_checker/python_test_run.rb +33 -0
- data/lib/hw_checker/ruby_stat.rb +38 -0
- data/lib/hw_checker/ruby_test_run.rb +34 -0
- data/lib/hw_checker/test_run_stat.rb +25 -0
- data/lib/hw_checker/unarchive.rb +4 -0
- data/lib/hw_checker/zip.rb +10 -0
- data/lib/hw_checker.rb +19 -0
- data/spec/base_spec.rb +32 -0
- data/spec/file_scan_spec.rb +48 -0
- data/spec/ruby_stat_spec.rb +30 -0
- data/spec/ruby_test_run_spec.rb +27 -0
- data/spec/test_run_stat_spec.rb +14 -0
- data/spec/zip_spec.rb +29 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YzdmNjYxYjYyNmFiYmQzMWYyN2VhOWNjYzA2ZDc2MjZiMzliZTU1Mg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZDFkNDMyMmM4YzJiMjNlMzhjMmJmNzI2YzgwMDVjMzhmNjNiZGRkMA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YjZhYTA4MmExMWJhNDNhOWFlM2E0ODE4NTBkMWJhYTBkZjhjZTEwNTY2NGI2
|
10
|
+
YjlkZjEwYmVmODk5OTljMWVkYTFiNjlkZjU4MWNkZmM1ZDI0NjhhYzdlNGIw
|
11
|
+
OTE2YmRiYjkwODVmYzAwOTg2YzU3MzJlYmY0Y2NlZjgxMzNlNzQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZmJiZjhjMjRhZjQzOTYzMTk2ZTk5OWY1ZDE0YWU5ZTA2OWU0MThjMjhjOWIy
|
14
|
+
Mjg0MDg0ZmI3MDEwZTU5YjNiNmI4YjM2NjRlNjdkNmFjNTk4MGNhMTIzZjRl
|
15
|
+
ZDI3MTQzYjY1MzAzODczMjM5YjJlMmQ4ZGZhODFhYWUzZjk2ZmU=
|
data/bin/hw_checker
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module HomeWorkChecker
|
2
|
+
class Base
|
3
|
+
def self.start(work_path, tmp_path, name, type)
|
4
|
+
`rm -r #{tmp_path}/#{name}` if Dir.exist?("#{tmp_path}/#{name}")
|
5
|
+
time_start, xml_content = Time.now, {}
|
6
|
+
Unarchive::Zip.new("#{work_path}/#{name+type}", tmp_path)
|
7
|
+
stat = TestRunStat::execute(work_path, tmp_path, name)
|
8
|
+
stat << (Time.now - time_start).round(2)
|
9
|
+
|
10
|
+
File.open("#{work_path}/#{name}-result.xml", 'w') do |file|
|
11
|
+
file.write(generate_xml_content(name, stat) )
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def self.generate_xml_content(identity, info)
|
17
|
+
Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
18
|
+
xml.root {
|
19
|
+
xml.student identity.split('_').first # name
|
20
|
+
xml.homework identity.split('_').last # homework
|
21
|
+
xml.language info[0] # language
|
22
|
+
xml.ratio info[1] # ratio of passed and failed tests
|
23
|
+
xml.quality info[2] # code quality
|
24
|
+
xml.time info[3] # time of executing
|
25
|
+
}
|
26
|
+
end.to_xml
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module HomeWorkChecker
|
2
|
+
class FileScan
|
3
|
+
def initialize(work_path, tmp_path = '/tmp')
|
4
|
+
raise "Directory #{work_path} does not exist" unless Dir::exist?(work_path)
|
5
|
+
raise "Directory #{tmp_path} does not exist" unless Dir::exist?(tmp_path)
|
6
|
+
@work_path, @tmp_path, @files = work_path, tmp_path, []
|
7
|
+
Dir.foreach(@work_path) do |p|
|
8
|
+
if File.file?("#{@work_path}/#{p}") && FILE_TYPES.include?(File.extname p) && !exist_xml?(p)
|
9
|
+
@files << p
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def each
|
15
|
+
if block_given?
|
16
|
+
i = 0
|
17
|
+
while i < @files.size
|
18
|
+
type = File.extname(@files[i])
|
19
|
+
name = @files[i].chomp(type)
|
20
|
+
yield(name, type)
|
21
|
+
i += 1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
@files
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def exist_xml?(archive_name)
|
29
|
+
temp = archive_name.chomp(File.extname archive_name)
|
30
|
+
File.exist? "#{@work_path}/#{temp}-result.xml"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module HomeWorkChecker
|
2
|
+
module TestRunStat
|
3
|
+
class PythonStat
|
4
|
+
def initialize(tmp_path, dirname)
|
5
|
+
@tmp_path, @dirname= tmp_path, dirname
|
6
|
+
@lines_all = @lines_failed = 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform
|
10
|
+
result = 0
|
11
|
+
Dir.foreach("#{@tmp_path}/#{@dirname}/tests/statistic") do |p|
|
12
|
+
next unless File.file?("#{@tmp_path}/#{@dirname}/tests/statistic/#{p}") && File.extname(p) == '.py' && p != '__init__.py'
|
13
|
+
`pylint #{@tmp_path}/#{@dirname}/tests/statistic/#{p} > #{@tmp_path}/#{@dirname}/tests/statistic/#{p}.tmp 2>&1`
|
14
|
+
result = calc_percent_quality("#{@tmp_path}/#{@dirname}/tests/statistic/#{p}.tmp")
|
15
|
+
end
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
def calc_percent_quality(filename)
|
20
|
+
( (`tail -n 2 #{filename}`).scan(/\d{1,2}/).shift.to_f / 10 * 100).round(2)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module HomeWorkChecker
|
2
|
+
module TestRunStat
|
3
|
+
class PythonTestRun
|
4
|
+
def initialize(tmp_path, dirname)
|
5
|
+
@tmp_path, @dirname= tmp_path, dirname
|
6
|
+
@passed = @failed = 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform
|
10
|
+
Dir.foreach("#{@tmp_path}/#{@dirname}/tests/application") do |p|
|
11
|
+
next unless File.file?("#{@tmp_path}/#{@dirname}/tests/application/#{p}") && File.extname(p) == '.py' && p != '__init__.py'
|
12
|
+
`python #{@tmp_path}/#{@dirname}/tests/application/#{p} > #{@tmp_path}/#{@dirname}/tests/application/#{p}.tmp 2>&1`
|
13
|
+
count_passed_failed("#{@tmp_path}/#{@dirname}/tests/application/#{p}.tmp")
|
14
|
+
end
|
15
|
+
calc_percent_passed
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def count_passed_failed(filename)
|
20
|
+
report = File.open(filename).first.chomp
|
21
|
+
report.each_char do |value|
|
22
|
+
@passed += 1 if value == '.'
|
23
|
+
@failed += 1 if (value == 'F' || value == 'E')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def calc_percent_passed
|
28
|
+
return 0.00 if @passed.zero? && @failed.zero?
|
29
|
+
(@passed.to_f / (@passed + @failed) * 100).round(2)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module HomeWorkChecker
|
2
|
+
module TestRunStat
|
3
|
+
class RubyStat
|
4
|
+
def initialize(tmp_path, dirname)
|
5
|
+
@tmp_path, @dirname= tmp_path, dirname
|
6
|
+
@lines_all = @lines_failed = 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform
|
10
|
+
Dir.foreach("#{@tmp_path}/#{@dirname}") do |p|
|
11
|
+
next unless File::file?("#{@tmp_path}/#{@dirname}/#{p}") && File.extname(p) == '.rb'
|
12
|
+
`rubocop #{@tmp_path}/#{@dirname}/#{p} > #{@tmp_path}/#{@dirname}/#{p}.tmp`
|
13
|
+
count_lines_failed("#{@tmp_path}/#{@dirname}/#{p}.tmp")
|
14
|
+
count_lines_all("#{@tmp_path}/#{@dirname}/#{p}")
|
15
|
+
end
|
16
|
+
calc_percent_quality
|
17
|
+
end
|
18
|
+
|
19
|
+
def count_lines_failed(filename)
|
20
|
+
temp = []
|
21
|
+
File.open(filename).each_line do |line|
|
22
|
+
next unless line.match(/[CW]:\s+\d+:\s+[\w\W]{4,}/)
|
23
|
+
temp << line.scan(/\d+/).first.to_i
|
24
|
+
end
|
25
|
+
@lines_failed += temp.uniq.size
|
26
|
+
end
|
27
|
+
|
28
|
+
def count_lines_all(filename)
|
29
|
+
File.open(filename).each_line { @lines_all += 1 }
|
30
|
+
end
|
31
|
+
|
32
|
+
def calc_percent_quality
|
33
|
+
return 0.00 if @lines_all.zero?
|
34
|
+
( (1.0 - @lines_failed.to_f / @lines_all) * 100).round(2)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module HomeWorkChecker
|
2
|
+
module TestRunStat
|
3
|
+
class RubyTestRun
|
4
|
+
def initialize(tmp_path, dirname)
|
5
|
+
@tmp_path, @dirname= tmp_path, dirname
|
6
|
+
@passed = @failed = 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform
|
10
|
+
Dir.foreach("#{@tmp_path}/#{@dirname}/test") do |p|
|
11
|
+
next unless File.file?("#{@tmp_path}/#{@dirname}/test/#{p}") && File.extname(p) == '.rb'
|
12
|
+
`rspec #{@tmp_path}/#{@dirname}/test/#{p} > #{@tmp_path}/#{@dirname}/test/#{p}.tmp`
|
13
|
+
count_passed_failed("#{@tmp_path}/#{@dirname}/test/#{p}.tmp")
|
14
|
+
end
|
15
|
+
calc_percent_passed
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def count_passed_failed(filename)
|
20
|
+
report = File.open(filename).first.chomp
|
21
|
+
return if report == 'No examples found.'
|
22
|
+
report.each_char do |value|
|
23
|
+
@passed += 1 if value == '.'
|
24
|
+
@failed += 1 if value == 'F'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def calc_percent_passed
|
29
|
+
return 0.00 if @passed.zero? && @failed.zero?
|
30
|
+
(@passed.to_f / (@passed + @failed) * 100).round(2)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module HomeWorkChecker
|
2
|
+
module TestRunStat
|
3
|
+
def self.detect_language(path)
|
4
|
+
return '.py' unless Dir.exist?("#{path}/test")
|
5
|
+
Dir.foreach("#{path}/test") do |p|
|
6
|
+
if File.file?("#{path}/test/#{p}") && LANGUAGE_TYPES.include?(File.extname p)
|
7
|
+
return File.extname p
|
8
|
+
end
|
9
|
+
end
|
10
|
+
raise "Any .rb/.py file doesn't exist"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.execute(work_path, tmp_path, dirname)
|
14
|
+
lang_needed = TestRunStat::detect_language("#{tmp_path}/#{dirname}")
|
15
|
+
class_names = LANGUAGE_TYPES[lang_needed]
|
16
|
+
test_passed = class_names.first.new(tmp_path, dirname).perform
|
17
|
+
code_quality = class_names.last.new(tmp_path, dirname).perform
|
18
|
+
[name_language(lang_needed), test_passed, code_quality]
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.name_language(extname)
|
22
|
+
extname == '.rb' ? 'ruby' : 'python'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/hw_checker.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'hw_checker/base'
|
3
|
+
require 'hw_checker/file_scan'
|
4
|
+
require 'hw_checker/unarchive'
|
5
|
+
require 'hw_checker/zip'
|
6
|
+
require 'hw_checker/test_run_stat'
|
7
|
+
require 'hw_checker/python_stat'
|
8
|
+
require 'hw_checker/python_test_run'
|
9
|
+
require 'hw_checker/ruby_stat'
|
10
|
+
require 'hw_checker/ruby_test_run'
|
11
|
+
|
12
|
+
|
13
|
+
module HomeWorkChecker
|
14
|
+
FILE_TYPES = ['.7z', '.zip']
|
15
|
+
LANGUAGE_TYPES = {
|
16
|
+
'.rb' => [TestRunStat::RubyTestRun, TestRunStat::RubyStat],
|
17
|
+
'.py' => [TestRunStat::PythonTestRun, TestRunStat::PythonStat]
|
18
|
+
}
|
19
|
+
end
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'hw_checker'
|
2
|
+
|
3
|
+
module HomeWorkChecker
|
4
|
+
describe Base do
|
5
|
+
before(:each) do
|
6
|
+
@archives = ['aaa.zip', 'bbb.7z']
|
7
|
+
@work_path = './support/'
|
8
|
+
@tmp_path = './support/tmp'
|
9
|
+
#@baza = HomeWorkChecker::Base.new(@work_path)
|
10
|
+
end
|
11
|
+
context '#start' do
|
12
|
+
it 'extracting should execute 5 times' do
|
13
|
+
files_to = double("FileScan", :work_path => @work_path)
|
14
|
+
files_to.stub(:files).and_return(@archives)
|
15
|
+
|
16
|
+
szip_files = stub("HomeWorkChecker::Unarchive::Zip")
|
17
|
+
szip_files.should_receive(:new).with("aaa.zip", @tmp_path).once
|
18
|
+
szip_files.should_receive(:new).with("bbb.7z", @tmp_path).once
|
19
|
+
|
20
|
+
run_files = double("HomeWorkChecker::TestRunStat")
|
21
|
+
run_files.stub(:detect_language).with("#{@tmp_path}/task1").and_return(".rb")
|
22
|
+
rtr = stub(LANGUAGE_TYPES[run_files.detect_language "#{@tmp_path}/task1"])
|
23
|
+
rtr.should_receive(:new).with("#{@tmp_path}/task1").once
|
24
|
+
|
25
|
+
files_to.stub(:each).
|
26
|
+
and_yield(stub(szip_files.new(files_to.files[0], @tmp_path)),
|
27
|
+
stub(rtr.new("#{@tmp_path}/task1"))).
|
28
|
+
and_yield(stub(szip_files.new(files_to.files[1], @tmp_path)))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'hw_checker'
|
2
|
+
|
3
|
+
module HomeWorkChecker
|
4
|
+
describe FileScan do
|
5
|
+
before(:each) do
|
6
|
+
@file_scan = FileScan.new('./support')
|
7
|
+
end
|
8
|
+
|
9
|
+
context '.new' do
|
10
|
+
def is_all_archives?
|
11
|
+
@file_scan.instance_variable_get(:@files).each do |item; ext_name|
|
12
|
+
ext_name = File::extname(item)
|
13
|
+
return false unless FILE_TYPES.include?(ext_name)
|
14
|
+
end
|
15
|
+
true
|
16
|
+
end
|
17
|
+
it 'should have exactly 6 items' do
|
18
|
+
@file_scan.instance_variable_get(:@files).should have(7).items
|
19
|
+
end
|
20
|
+
it 'should contain .zip/7z files only' do
|
21
|
+
is_all_archives?.should_not be_false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context '#each' do
|
26
|
+
before(:each) do
|
27
|
+
@file_scan.instance_variable_get(:@files).sort!
|
28
|
+
end
|
29
|
+
it 'should yield correct data' do
|
30
|
+
expect { |b| @file_scan.each(&b) }.to yield_successive_args(
|
31
|
+
["julia.tymo_creational.patterns", ".7z"],
|
32
|
+
["julia.tymo_iterators.in.ruby", ".zip"],
|
33
|
+
["pavlo.petryk_creational.patterns", ".zip"],
|
34
|
+
["pavlo.petryk_final.tasks", ".7z"],
|
35
|
+
["roman.horobets_creational.patterns", ".7z"],
|
36
|
+
["roman.horobets_final.tasks", ".zip"],
|
37
|
+
["roman.horobets_iterators.in.ruby", ".zip"]
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context '#exist_xml?' do
|
43
|
+
it 'xml-file should exist' do
|
44
|
+
@file_scan.should_not be_exist_xml('test.xml')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'hw_checker'
|
2
|
+
|
3
|
+
module HomeWorkChecker
|
4
|
+
module TestRunStat
|
5
|
+
describe RubyStat do
|
6
|
+
before(:all) do
|
7
|
+
@ruby_stat = RubyStat.new('./support', 'julia.tymo_creational.patterns')
|
8
|
+
@ruby_stat.perform
|
9
|
+
end
|
10
|
+
|
11
|
+
context '#count_lines_failed' do
|
12
|
+
it 'should calculate failed lines correctly' do
|
13
|
+
@ruby_stat.instance_variable_get(:@lines_failed).should == 5
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context '#count_lines_all' do
|
18
|
+
it 'should calculate failed lines count correctly' do
|
19
|
+
@ruby_stat.instance_variable_get(:@lines_all).should == 7
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context '#calc_percent_quality' do
|
24
|
+
it 'should calculate percent correctly' do
|
25
|
+
@ruby_stat.send(:calc_percent_quality).should == 28.57
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'hw_checker'
|
2
|
+
|
3
|
+
module HomeWorkChecker
|
4
|
+
module TestRunStat
|
5
|
+
describe RubyTestRun do
|
6
|
+
before(:all) do
|
7
|
+
@ruby_test_run = RubyTestRun.new('./support', 'julia.tymo_creational.patterns')
|
8
|
+
@ruby_test_run.perform
|
9
|
+
end
|
10
|
+
|
11
|
+
context '#count_passed_failed' do
|
12
|
+
it 'should calculate passed tests correctly' do
|
13
|
+
@ruby_test_run.instance_variable_get(:@passed).should == 0
|
14
|
+
end
|
15
|
+
it 'should calculate failed tests correctly' do
|
16
|
+
@ruby_test_run.instance_variable_get(:@failed).should == 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context '#calc_percent_passed' do
|
21
|
+
it 'should calculate percent passed tests correctly' do
|
22
|
+
@ruby_test_run.send(:calc_percent_passed).should == 0.00
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'hw_checker'
|
2
|
+
|
3
|
+
module HomeWorkChecker
|
4
|
+
describe HomeWorkChecker::TestRunStat do
|
5
|
+
context '.detect_language' do
|
6
|
+
before(:each) do
|
7
|
+
@detect_test = TestRunStat.detect_language('./support/julia.tymo_creational.patterns')
|
8
|
+
end
|
9
|
+
it 'should contain .rb/.py tests' do
|
10
|
+
@detect_test.should == '.rb'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/spec/zip_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'hw_checker'
|
2
|
+
|
3
|
+
describe HomeWorkChecker::Unarchive::Zip do
|
4
|
+
before(:each) do
|
5
|
+
@path_filename = './support/julia.tymo_creational.patterns.7z'
|
6
|
+
@filename = 'julia.tymo_creational.patterns.7z'
|
7
|
+
@tmp_path = '/tmp/support/'
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:each) do
|
11
|
+
`rm -rf #{@tmp_path}/#{@filename.chomp(".7z") || filename.chomp(".zip")}`
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should exist in temp' do
|
15
|
+
@unarchive1 = HomeWorkChecker::Unarchive::Zip.new(@path_filename, @tmp_path)
|
16
|
+
Dir.exist?("#{@tmp_path}/#{@filename.chomp(".7z") || filename.chomp(".zip")}").should be_true
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'authenticity archive' do
|
20
|
+
@authenticity = `7za t #{@path_filename}`
|
21
|
+
@authenticity = @authenticity.include? "Everything is Ok"
|
22
|
+
@authenticity.should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'exit code' do
|
26
|
+
@unarchive1 = HomeWorkChecker::Unarchive::Zip.new(@path_filename, @tmp_path)
|
27
|
+
$?.to_s[-1].to_i.should equal(0)
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hw_checker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.43
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lv-LAMP-085
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-06-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
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: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.7.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.7.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description:
|
56
|
+
email:
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/hw_checker/python_test_run.rb
|
62
|
+
- lib/hw_checker/ruby_test_run.rb
|
63
|
+
- lib/hw_checker/base.rb
|
64
|
+
- lib/hw_checker/file_scan.rb
|
65
|
+
- lib/hw_checker/unarchive.rb
|
66
|
+
- lib/hw_checker/python_stat.rb
|
67
|
+
- lib/hw_checker/test_run_stat.rb
|
68
|
+
- lib/hw_checker/zip.rb
|
69
|
+
- lib/hw_checker/ruby_stat.rb
|
70
|
+
- lib/hw_checker.rb
|
71
|
+
- bin/hw_checker
|
72
|
+
- spec/ruby_stat_spec.rb
|
73
|
+
- spec/test_run_stat_spec.rb
|
74
|
+
- spec/zip_spec.rb
|
75
|
+
- spec/base_spec.rb
|
76
|
+
- spec/ruby_test_run_spec.rb
|
77
|
+
- spec/file_scan_spec.rb
|
78
|
+
homepage:
|
79
|
+
licenses: []
|
80
|
+
metadata: {}
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
requirements: []
|
96
|
+
rubyforge_project:
|
97
|
+
rubygems_version: 2.0.3
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: Ruby-based utility to calculate hometasks
|
101
|
+
test_files: []
|