tdx 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef5e18a4802efc6489e237ca91d8f658babe17ec
4
- data.tar.gz: f55674b137c243f48cfdf53e5ec7d34cc2cd08ce
3
+ metadata.gz: 68d11ea43666fcba743422938f2601d134729df8
4
+ data.tar.gz: 9010264c48eaa44be853ba28429b6791d7fc3025
5
5
  SHA512:
6
- metadata.gz: a96917b41359f944b2e382689fc1f4790390206a84f9e8b696f1d4ab308cb85008ebd9dceff178bb06c8371416d2f19d3c790420236f592d7f3c51e845d95a03
7
- data.tar.gz: bda57e4def1b0070e3c846c934adfe5d23a34d6ff59e603241bd0ddbdf228593d0442a8435746a6740305f18cd17e7e10b32b201874aad52100657d9da26bd43
6
+ metadata.gz: 61a83ceae6741bb1dceecb7b25d9b8843360bc24ffd93e9d67e782df9c4667da6f1b995f74018861265de997a2c22b28f8080bf413a8c4311b6129971319ec9a
7
+ data.tar.gz: aa159cf35de15d1e93d4ef80d7f9fb2d422672463e33113a0b74dc9b43021000a622c0ae02e11dcf8ba584957a655bff7e768df5611771bf9d6d50936f40f1a5
data/.rubocop.yml CHANGED
@@ -4,9 +4,12 @@ AllCops:
4
4
  Metrics/MethodLength:
5
5
  Max: 150
6
6
  Metrics/ClassLength:
7
- Max: 150
7
+ Max: 300
8
8
  Metrics/AbcSize:
9
9
  Max: 200
10
+ Metrics/PerceivedComplexity:
11
+ Max: 10
12
+
10
13
  Style/MultilineMethodCallIndentation:
11
14
  Enabled: false
12
15
  Style/IndentationWidth:
data/README.md CHANGED
@@ -15,8 +15,7 @@ I will tell you later...
15
15
  ## How to Install?
16
16
 
17
17
  First, install
18
- [gnuplot](http://www.gnuplot.info/),
19
- [cloc](http://cloc.sourceforge.net/),
18
+ [gnuplot](http://www.gnuplot.info/)
20
19
  and
21
20
  [hoc](https://github.com/yegor256/hoc).
22
21
 
data/bin/tdx CHANGED
@@ -35,7 +35,7 @@ opts = Slop.parse(args, strict: true, help: true) do |o|
35
35
  o.array(
36
36
  '-t', '--tests',
37
37
  'Comma-separated list of glob masks with test-related files',
38
- delimiter: ','
38
+ delimiter: ',', default: []
39
39
  )
40
40
  o.string '-d', '--data', 'Path of .dat file for Gnuplot'
41
41
  o.string '--sha', 'The SHA to start from'
data/lib/tdx/base.rb CHANGED
@@ -38,6 +38,11 @@ module TDX
38
38
  def initialize(uri, opts)
39
39
  @uri = uri
40
40
  @opts = opts
41
+ @issues = nil
42
+ @pure = nil
43
+ @hoc = nil
44
+ @logopts = '--ignore-space-change --no-color --find-copies-harder \
45
+ --ignore-all-space --ignore-submodules -M --diff-filter=ACDM'
41
46
  end
42
47
 
43
48
  def svg
@@ -46,51 +51,36 @@ module TDX
46
51
  Gem::Version.new(version) >= Gem::Version.new('2.0')
47
52
  path = checkout
48
53
  commits = Exec.new(
49
- 'git log "--pretty=format:%H %cI" ' +
54
+ "git log '--pretty=format:%H %cI' #{@logopts} " +
50
55
  (@opts[:sha] ? @opts[:sha] : 'HEAD'),
51
56
  path
52
57
  ).stdout.split(/\n/).map { |c| c.split(' ') }
53
- issues = issues(commits)
54
- puts "Date\t\t\tTest\tHoC\tFiles\tLoC\tIssues\tSHA\tIdx"
58
+ puts "Date\t\t\tCode\tTests\tIssues\tSHA\tIdx"
55
59
  metrics = commits.each_with_index.map do |c, i|
56
- Exec.new("git checkout --quiet #{c[0]}", path).stdout
60
+ Exec.new("git checkout --quiet --force #{c[0]}", path).stdout
61
+ pure = pure(path, c[0])
57
62
  m = {
58
63
  date: c[1],
59
- pure: pure(path),
60
- hoc: hoc(path),
61
- files: files(path),
62
- loc: loc(path),
63
- issues: issues[c[0]],
64
+ code: pure,
65
+ tests: hoc(path, c[0]) - pure,
66
+ issues: issues(commits)[c[0]],
64
67
  sha: c[0]
65
68
  }
66
- puts "#{m[:date][0, 16]}\t#{m[:pure]}\t#{m[:hoc]}\t#{m[:files]}\t\
67
- #{m[:loc]}\t#{m[:issues]}\t#{m[:sha][0, 7]}\t#{i}/#{commits.size}"
69
+ puts "#{m[:date][0, 16]}\t#{m[:code]}\t#{m[:tests]}\t\
70
+ #{m[:issues]}\t#{m[:sha][0, 7]}\t#{i}/#{commits.size}"
68
71
  m
69
72
  end
70
- max = { pure: 0, hoc: 0, files: 0, loc: 0, issues: 0 }
71
- max = metrics.inject(max) do |m, t|
72
- {
73
- pure: [m[:pure], t[:pure], 1].max,
74
- hoc: [m[:hoc], t[:hoc], 1].max,
75
- files: [m[:files], t[:files], 1].max,
76
- loc: [m[:loc], t[:loc], 1].max,
77
- issues: [m[:issues], t[:issues], 1].max
78
- }
79
- end
80
73
  dat = if @opts[:data]
81
74
  File.new(@opts[:data], 'w+')
82
75
  else
83
76
  Tempfile.new('tdx')
84
77
  end
85
- metrics.each do |m|
78
+ metrics.select { |m| m[:code] > 0 }.each do |m|
86
79
  dat << [
87
80
  m[:date],
88
- 100.0 * m[:pure] / max[:pure],
89
- 100.0 * (m[:pure] - m[:hoc]) / (max[:pure] - max[:hoc]),
90
- 100.0 * m[:hoc] / max[:hoc],
91
- 100.0 * m[:files] / max[:files],
92
- 100.0 * m[:loc] / max[:loc],
93
- 100.0 * m[:issues] / max[:issues],
81
+ m[:code],
82
+ m[:tests],
83
+ m[:issues],
94
84
  m[:sha]
95
85
  ].join(' ') + "\n"
96
86
  end
@@ -102,17 +92,18 @@ module TDX
102
92
  'set termoption font "monospace,10"',
103
93
  'set xdata time',
104
94
  'set timefmt "%Y-%m"',
105
- 'set ytics format "%.0f%%" textcolor rgb "black"',
95
+ 'set ytics format "%.0f" textcolor rgb "black"',
96
+ 'set y2tics format "%.0f" textcolor rgb "orange"',
106
97
  'set grid linecolor rgb "gray"',
107
98
  'set xtics format "%b/%y" font "monospace,8" textcolor rgb "black"',
108
- 'set autoscale',
99
+ 'set autoscale y',
100
+ 'set autoscale y2',
109
101
  'set style fill solid',
110
102
  'set boxwidth 0.75 relative',
111
103
  [
112
- "plot \"#{dat.path}\" using 1:3 with lines",
113
- 'title "Test HoC" linecolor rgb "#81b341"',
114
- ', "" using 1:4 with lines title "HoC" linecolor rgb "red"',
115
- ', "" using 1:7 with lines title "Issues" linecolor rgb "orange"'
104
+ "plot \"#{dat.path}\" u 1:2 w l t \"code\" lc rgb \"#81b341\"",
105
+ ', "" u 1:3 w l t "tests" lc rgb "red"',
106
+ ', "" u 1:4 w l t "Issues" lc rgb "orange" axes x1y2'
116
107
  ].join(' ')
117
108
  ]
118
109
  Exec.new("gnuplot -e '#{gpi.join('; ')}'").stdout
@@ -128,39 +119,43 @@ module TDX
128
119
  def checkout
129
120
  dir = Dir.mktmpdir
130
121
  Exec.new("git clone --quiet #{@uri} .", dir).stdout
131
- size = Dir.glob(File.join(dir, '**/*'))
132
- .map(&:size)
133
- .inject(0) { |a, e| a + e }
122
+ size = Dir.glob(File.join(dir, '**', '*')).map(&:size).inject(:+)
134
123
  puts "Cloned #{@uri} (#{size / 1024}Kb) into temporary directory"
135
124
  dir
136
125
  end
137
126
 
138
- def files(path)
139
- Dir.glob("#{path}/**/*").size
127
+ def pure(path, sha)
128
+ @pure = hashes(path, @opts[:tests]) if @pure.nil?
129
+ sum(@pure, sha)
140
130
  end
141
131
 
142
- def loc(path)
143
- Nokogiri::XML.parse(Exec.new('cloc . --xml --quiet', path).stdout)
144
- .xpath('/results/languages/total/@code')[0].to_s.to_i
132
+ def hoc(path, sha)
133
+ @hoc = hashes(path, []) if @hoc.nil?
134
+ sum(@hoc, sha)
145
135
  end
146
136
 
147
- def pure(path)
148
- exclude = if @opts[:tests]
149
- @opts[:tests].map { |e| "--exclude=#{e}" }
150
- else
151
- []
152
- end
137
+ def hashes(path, excludes)
153
138
  Exec.new(
154
- 'hoc ' + exclude.join(' '),
139
+ "git log --pretty=tformat:%H --numstat #{@logopts} -- . " +
140
+ excludes.map { |e| "':(exclude,glob)#{e}'" }.join(' '),
155
141
  path
156
- ).stdout.strip.to_i
142
+ ).stdout.split(/(?=[0-9a-f]{40})/m).map do |t|
143
+ lines = t.split("\n")
144
+ [
145
+ lines[0],
146
+ lines.drop(2).map do |n|
147
+ n.split(/\s+/).take(2).map(&:to_i).inject(:+)
148
+ end.inject(:+) || 0
149
+ ]
150
+ end
157
151
  end
158
152
 
159
- def hoc(path)
160
- Exec.new('hoc', path).stdout.strip.to_i
153
+ def sum(hashes, sha)
154
+ hashes.drop_while { |c| c[0] != sha }.map { |c| c[1] }.inject(:+) || 0
161
155
  end
162
156
 
163
157
  def issues(commits)
158
+ return @issues unless @issues.nil?
164
159
  dates = if @uri.include?('github.com')
165
160
  client = if @opts[:login]
166
161
  Octokit::Client.new(login: @opts[:login], password: @opts[:password])
@@ -172,13 +167,23 @@ module TDX
172
167
  else
173
168
  @uri.gsub(%r{^https://github\.com/|\.git$}, '')
174
169
  end
175
- list = client.list_issues(repo, state: :all).map(&:created_at)
170
+ list = []
171
+ p = 1
172
+ loop do
173
+ page = client.list_issues(
174
+ repo, state: 'all', page: p
175
+ ).map(&:created_at)
176
+ break if page.empty?
177
+ list.concat(page)
178
+ puts "+#{page.length}/#{list.size} issues from GitHub"
179
+ p += 1
180
+ end
176
181
  puts "Loaded #{list.length} issues from GitHub repo '#{repo}'"
177
182
  list
178
183
  else
179
184
  []
180
185
  end
181
- commits.map do |sha, date|
186
+ @issues = commits.map do |sha, date|
182
187
  iso = Time.parse(date)
183
188
  [sha, dates.select { |d| d < iso }.size]
184
189
  end.to_h
data/lib/tdx/exec.rb CHANGED
@@ -36,11 +36,14 @@ module TDX
36
36
  def initialize(cmd, dir = '.')
37
37
  @cmd = cmd
38
38
  @dir = dir
39
+ @log = false
39
40
  end
40
41
 
41
42
  def stdout
42
- out = `cd #{@dir} && #{@cmd} 2>/dev/null`
43
+ puts "+ #{@cmd}" if @log
44
+ out = `cd #{@dir} && #{@cmd}`
43
45
  raise "This one failed: #{@cmd}" unless $CHILD_STATUS.exitstatus == 0
46
+ puts out if @log
44
47
  out
45
48
  end
46
49
  end
data/lib/tdx/version.rb CHANGED
@@ -25,5 +25,5 @@
25
25
  # Copyright:: Copyright (c) 2017 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module TDX
28
- VERSION = '0.2.5'.freeze
28
+ VERSION = '0.2.6'.freeze
29
29
  end
data/tdx.gemspec CHANGED
@@ -51,7 +51,6 @@ Gem::Specification.new do |s|
51
51
  s.add_development_dependency 'cucumber', '1.3.17'
52
52
  s.add_development_dependency 'coveralls', '0.7.2'
53
53
  s.add_development_dependency 'rubocop', '0.41.2'
54
- s.add_development_dependency 'hoc', '0.8'
55
54
  s.add_development_dependency 'rubocop-rspec', '1.5.1'
56
55
  s.add_development_dependency 'minitest', '5.10.1'
57
56
  end
data/test/test__helper.rb CHANGED
@@ -24,4 +24,6 @@ require 'simplecov'
24
24
  require 'tdx'
25
25
  require 'minitest/autorun'
26
26
 
27
+ ENV['RACK_ENV'] = 'test'
28
+
27
29
  STDOUT.sync = true
data/test/test_tdx.rb CHANGED
@@ -41,6 +41,7 @@ class TestPDD < Minitest::Test
41
41
  git config user.email yegor256@gmail.com
42
42
  git config user.name 'Mr. Tester'
43
43
  echo 'a = 1' > 1.rb && git add 1.rb && git commit -qam '1'
44
+ rm 1.rb
44
45
  echo '<?php b = 2' > 2.php && git add 2.php && git commit -qam '2'
45
46
  mkdir tests
46
47
  echo 'c = 3' > tests/3.py && git add tests/3.py && git commit -qam '3'
@@ -58,7 +59,7 @@ class TestPDD < Minitest::Test
58
59
  assert(
59
60
  TDX::Base.new(
60
61
  'https://github.com/yegor256/empty.git',
61
- opts(['--tests', 'src/test/**/*', '--sha', '7c7000d'])
62
+ opts(['--tests', 'src/test/**/*'])
62
63
  ).svg.include?('<path ')
63
64
  )
64
65
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tdx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -108,20 +108,6 @@ dependencies:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.41.2
111
- - !ruby/object:Gem::Dependency
112
- name: hoc
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '='
116
- - !ruby/object:Gem::Version
117
- version: '0.8'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '='
123
- - !ruby/object:Gem::Version
124
- version: '0.8'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: rubocop-rspec
127
113
  requirement: !ruby/object:Gem::Requirement