tdx 0.2.5 → 0.2.6

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 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