cobench 0.0.28 → 0.0.31

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
  SHA256:
3
- metadata.gz: 59a9eeca7f5fcb377fcd74fd3d61dba8e2e3a8f9d28b456a5395ae6bab04781c
4
- data.tar.gz: 4a1437f4564485167e80c14e66bbfe525529a8ee19738e6ebbea65d614de3de1
3
+ metadata.gz: b950466b65dafeb1dc0ec2066fcd3a61e75d0470b2810944181a0a7704d8b2d6
4
+ data.tar.gz: cb692c9353443c05b1b4912a76305617212d532da458ff86ea1df12e2d11f406
5
5
  SHA512:
6
- metadata.gz: 9a9050e83ed1b3dfb922f8664c1623b3aa6b4cb61bc659dfb49372023072cf6ec2d3d944a6a23990278afb8c87d551415b003277a2bb0c5e2846c1bfab6cc91b
7
- data.tar.gz: d0298ae4bd39ac293a2dfd91d745546143778211c93e56f28f1bc8975661d78d3fd68d10a8e981eca8bc80bb50c7747d2f60caf73e1855c311f348bd0b649c5a
6
+ metadata.gz: 5bbbbe914c7a2a627d518d1eb5b5baf1466bd60d15252098fcf9d0e2b7a3b41c3ceaeed22df4603b7e8ae404dff45e155b876290866e6ade19dffa47673e70f0
7
+ data.tar.gz: 460efed0d36d92adbe5549cb3299cf0071aa299dadf98e45a964b6e79f75d838b4f44d74a7d24a4532b9cb3f3c96d0b5e4c4ec9d3ecb129d42a9e79039c463eb
data/Rakefile CHANGED
@@ -31,7 +31,7 @@ def version
31
31
  Gem::Specification.load(Dir['*.gemspec'].first).version
32
32
  end
33
33
 
34
- task default: %i[clean test features rubocop copyright]
34
+ task default: %i[clean test features rubocop xcop copyright]
35
35
 
36
36
  require 'rake/testtask'
37
37
  desc 'Run all unit tests'
@@ -59,6 +59,13 @@ RuboCop::RakeTask.new(:rubocop) do |task|
59
59
  task.options = ['--display-cop-names']
60
60
  end
61
61
 
62
+ require 'xcop/rake_task'
63
+ Xcop::RakeTask.new(:xcop) do |task|
64
+ task.license = 'LICENSE.txt'
65
+ task.includes = ['**/*.xml', '**/*.xsl', '**/*.xsd', '**/*.html']
66
+ task.excludes = ['cobench/**', 'coverage/**']
67
+ end
68
+
62
69
  require 'cucumber/rake/task'
63
70
  Cucumber::Rake::Task.new(:features) do
64
71
  Rake::Cleaner.cleanup_files(['coverage'])
data/assets/index.xsl CHANGED
@@ -23,7 +23,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
23
  SOFTWARE.
24
24
  -->
25
25
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
26
- <xsl:output encoding="UTF-8" method="xml"/>
26
+ <xsl:output method="xml" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes"/>
27
+ <xsl:strip-spaces select="*"/>
27
28
  <xsl:param name="version"/>
28
29
  <xsl:template match="/">
29
30
  <html>
@@ -35,23 +36,38 @@ SOFTWARE.
35
36
  <link rel="icon" href="https://raw.githubusercontent.com/yegor256/cobench/master/logo.svg" type="image/svg"/>
36
37
  <link href="https://cdn.jsdelivr.net/gh/yegor256/tacit@gh-pages/tacit-css.min.css" rel="stylesheet"/>
37
38
  <link href="https://cdn.jsdelivr.net/gh/yegor256/drops@gh-pages/drops.min.css" rel="stylesheet"/>
38
- <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"/>
39
- <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.3/js/jquery.tablesorter.min.js"/>
39
+ <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js">
40
+ <xsl:text> </xsl:text>
41
+ </script>
42
+ <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.31.3/js/jquery.tablesorter.min.js">
43
+ <xsl:text> </xsl:text>
44
+ </script>
40
45
  <script type="text/javascript">
41
46
  $(function() {
42
47
  $("#metrics").tablesorter();
43
48
  });
49
+ $(function() {
50
+ let params = (new URL(document.location)).searchParams;
51
+ let org = params.get('org');
52
+ if (org) {
53
+ $('#metrics tbody tr:not(:has(&gt;td.org-' + org + '))').hide();
54
+ $('#org').text('@' + org);
55
+ $('#org-head').css('visibility', 'visible');
56
+ console.log('Showing @' + org + ' org');
57
+ }
58
+ });
44
59
  </script>
45
60
  <style>
46
61
  td, th { font-family: monospace; font-size: 18px; }
47
62
  .num { text-align: right; }
48
63
  .left { border-bottom: 0; }
49
- section { width: 100%; }
64
+ section { width: auto; }
50
65
  header { text-align: center; }
51
66
  footer { text-align: center; font-size: 0.8em; line-height: 1.2em; color: gray; }
52
67
  article { border: 0; }
53
68
  td.avatar { vertical-align: middle; text-align: center; }
54
- td.avatar img { width: 1.5em; height: 1.5em; vertical-align: middle; }
69
+ td.avatar img,
70
+ td.orgs img { width: 1.5em; height: 1.5em; vertical-align: middle; }
55
71
  .subtitle { font-size: 0.8em; line-height: 1em; color: gray; }
56
72
  .sorter { cursor: pointer; }
57
73
  </style>
@@ -66,14 +82,30 @@ SOFTWARE.
66
82
  </p>
67
83
  </header>
68
84
  <article>
85
+ <p id="org-head" style="visibility: hidden;">
86
+ <xsl:text>You only see people who contributed to </xsl:text>
87
+ <strong>
88
+ <span id="org">
89
+ <xsl:text>@???</xsl:text>
90
+ </span>
91
+ </strong>
92
+ <xsl:text>. </xsl:text>
93
+ <xsl:text>Click </xsl:text>
94
+ <a href="index.html">
95
+ <xsl:text>here</xsl:text>
96
+ </a>
97
+ <xsl:text> to see all.</xsl:text>
98
+ </p>
69
99
  <table id="metrics">
70
100
  <colgroup>
71
101
  <col/>
102
+ <col style="width: 2.5em;"/>
72
103
  <col/>
73
104
  <xsl:for-each select="cobench/titles/title">
74
105
  <xsl:sort select="."/>
75
106
  <col/>
76
107
  </xsl:for-each>
108
+ <col/>
77
109
  </colgroup>
78
110
  <thead>
79
111
  <xsl:apply-templates select="cobench/titles"/>
@@ -81,7 +113,7 @@ SOFTWARE.
81
113
  <xsl:apply-templates select="cobench/coders"/>
82
114
  <tfoot>
83
115
  <xsl:apply-templates select="cobench/totals"/>
84
- <xsl:apply-templates select="cobench/averages"/>
116
+ <xsl:apply-templates select="cobench/averages"/>
85
117
  </tfoot>
86
118
  </table>
87
119
  </article>
@@ -181,19 +213,27 @@ SOFTWARE.
181
213
  </xsl:template>
182
214
  <xsl:template match="cobench/titles">
183
215
  <tr>
184
- <th colspan="2"/>
216
+ <th class="sorter num">
217
+ <xsl:text>Top</xsl:text>
218
+ </th>
219
+ <th colspan="2">
220
+ <xsl:text>Programmer</xsl:text>
221
+ </th>
185
222
  <xsl:for-each select="title">
186
223
  <xsl:sort select="."/>
187
224
  <th class="sorter num">
188
225
  <xsl:value-of select="."/>
189
226
  </th>
190
227
  </xsl:for-each>
228
+ <th>
229
+ <xsl:text>Orgs</xsl:text>
230
+ </th>
191
231
  </tr>
192
232
  </xsl:template>
193
233
  <xsl:template match="cobench/totals">
194
234
  <xsl:variable name="totals" select="."/>
195
235
  <tr>
196
- <td colspan="2" style="text-align:right">Total:</td>
236
+ <td colspan="3" style="text-align:right">Total:</td>
197
237
  <xsl:for-each select="/cobench/titles/title">
198
238
  <xsl:sort select="."/>
199
239
  <xsl:variable name="t" select="."/>
@@ -201,12 +241,13 @@ SOFTWARE.
201
241
  <xsl:value-of select="$totals/w[@id=$t]"/>
202
242
  </td>
203
243
  </xsl:for-each>
244
+ <td/>
204
245
  </tr>
205
246
  </xsl:template>
206
247
  <xsl:template match="cobench/averages">
207
248
  <xsl:variable name="averages" select="."/>
208
249
  <tr>
209
- <td colspan="2" style="text-align:right">Average:</td>
250
+ <td colspan="3" style="text-align:right">Average:</td>
210
251
  <xsl:for-each select="/cobench/titles/title">
211
252
  <xsl:sort select="."/>
212
253
  <xsl:variable name="t" select="."/>
@@ -214,6 +255,7 @@ SOFTWARE.
214
255
  <xsl:value-of select="$averages/w[@id=$t]"/>
215
256
  </td>
216
257
  </xsl:for-each>
258
+ <td/>
217
259
  </tr>
218
260
  </xsl:template>
219
261
  <xsl:template match="cobench/coders">
@@ -223,6 +265,14 @@ SOFTWARE.
223
265
  </xsl:template>
224
266
  <xsl:template match="coder">
225
267
  <tr>
268
+ <td class="num">
269
+ <xsl:variable name="score" select="metrics/m[@id='Score']"/>
270
+ <xsl:variable name="pos" select="count(/cobench/coders/coder[metrics/m[@id='Score'] &lt; $score]) + 1"/>
271
+ <xsl:if test="$pos &lt;= 8">
272
+ <xsl:text>#</xsl:text>
273
+ <xsl:value-of select="$pos"/>
274
+ </xsl:if>
275
+ </td>
226
276
  <td class="avatar">
227
277
  <img src="https://socatar.com/github/{@id}/64-64"/>
228
278
  </td>
@@ -242,6 +292,27 @@ SOFTWARE.
242
292
  <xsl:sort select="@id"/>
243
293
  <xsl:apply-templates select="."/>
244
294
  </xsl:for-each>
295
+ <td class="orgs">
296
+ <xsl:attribute name="class">
297
+ <xsl:text>orgs</xsl:text>
298
+ <xsl:for-each select="orgs/org">
299
+ <xsl:text> org-</xsl:text>
300
+ <xsl:value-of select="."/>
301
+ </xsl:for-each>
302
+ </xsl:attribute>
303
+ <xsl:for-each select="orgs/org">
304
+ <xsl:sort select="."/>
305
+ <xsl:if test="position() &gt; 1">
306
+ <xsl:text> </xsl:text>
307
+ </xsl:if>
308
+ <a href="?org={.}" title="{.}">
309
+ <xsl:value-of select="substring(., 1, 2)"/>
310
+ <xsl:if test="string-length(.) &gt; 2">
311
+ <xsl:text>…</xsl:text>
312
+ </xsl:if>
313
+ </a>
314
+ </xsl:for-each>
315
+ </td>
245
316
  </tr>
246
317
  </xsl:template>
247
318
  <xsl:template match="m">
data/bin/cobench CHANGED
@@ -96,6 +96,7 @@ def build_xml(opts, loog)
96
96
  loog.info("Reading GitHub data for the last #{opts[:days]} days")
97
97
  titles = {}
98
98
  data = {}
99
+ orgs = {}
99
100
  opts[:coder].each do |u|
100
101
  user = u.downcase
101
102
  loog.info("Scanning #{user}...")
@@ -116,17 +117,24 @@ def build_xml(opts, loog)
116
117
  { title: 'Pulls', total: Random.new.rand(100) },
117
118
  { title: 'Commits', total: Random.new.rand(100) },
118
119
  { title: 'HoC', total: Random.new.rand(100) },
119
- { title: 'HoC', total: Random.new.rand(100) }
120
+ { title: 'HoC', total: Random.new.rand(100) },
121
+ { meta: true, title: 'Orgs', list: ['objectionary', 'artipie'] },
120
122
  ]
121
123
  else
122
124
  measures = m.take(loog)
123
125
  end
124
- measures.each do |d|
126
+ measures.reject {|ms| ms.key?(:meta)}.each do |ms|
125
127
  before = 0
126
- before += data[user][d[:title]][:total] if data[user][d[:title]] != nil
127
- data[user][d[:title]] = { total: d[:total] + before, href: d[:href] }
128
- titles[d[:title]] = d[:title]
129
- loog.info("The value of #{user}/#{d[:title]} is #{d[:total]}")
128
+ before += data[user][ms[:title]][:total] if data[user][ms[:title]] != nil
129
+ data[user][ms[:title]] = { total: ms[:total] + before, href: ms[:href] }
130
+ titles[ms[:title]] = ms[:title]
131
+ loog.info("The value of #{user}/#{ms[:title]} is #{ms[:total]}")
132
+ end
133
+ measures.select {|ms| ms.key?(:meta)}.each do |ms|
134
+ if ms[:title] == 'Orgs'
135
+ orgs[user] = [] unless orgs.key?(user)
136
+ end
137
+ orgs[user] += ms[:list]
130
138
  end
131
139
  end
132
140
  end
@@ -212,6 +220,13 @@ def build_xml(opts, loog)
212
220
  data.each do |u, ms|
213
221
  xml.coder(id: u) do
214
222
  xml.parent.set_attribute('details', api.user(u).name) unless opts[:dry]
223
+ if orgs.key?(u)
224
+ xml.orgs do
225
+ orgs[u].uniq.each do |o|
226
+ xml.org o
227
+ end
228
+ end
229
+ end
215
230
  xml.metrics do
216
231
  ms.each do |k, v|
217
232
  xml.m(id: k) do
@@ -251,7 +266,7 @@ begin
251
266
  html = xslt.transform(Nokogiri::XML(xml), 'version' => "'#{Cobench::VERSION}'")
252
267
  loog.debug(html)
253
268
  front = File.join(home, 'index.html')
254
- File.write(front, html)
269
+ File.write(front, html.to_html(indent: 0).gsub("\n", ''))
255
270
  loog.debug("HTML saved to #{front} (#{File.size(front)} bytes)")
256
271
  rescue StandardError => e
257
272
  loog.error(Backtrace.new(e))
data/cobench.gemspec CHANGED
@@ -48,6 +48,7 @@ Gem::Specification.new do |s|
48
48
  s.add_runtime_dependency 'octokit', '~>4.0'
49
49
  s.add_runtime_dependency 'rainbow', '~>3.0'
50
50
  s.add_runtime_dependency 'slop', '~>4.4'
51
+ s.add_runtime_dependency 'xcop', '~>0.6'
51
52
  s.add_development_dependency 'codecov', '0.6.0'
52
53
  s.add_development_dependency 'cucumber', '8.0.0'
53
54
  s.add_development_dependency 'minitest', '5.15.0'
@@ -38,16 +38,23 @@ class Cobench::Pulls
38
38
  json = @api.search_issues(q)
39
39
  loog.debug("Found #{json.total_count} pull requests")
40
40
  hoc = 0
41
+ orgs = []
41
42
  total = json.items.count do |p|
42
43
  pr = p.pull_request.url.split('/')[-1]
43
44
  repo = p.repository_url.split('/')[-2..-1].join('/')
44
45
  next unless Cobench::Match.new(@opts, loog).matches?(repo)
46
+ orgs += p.repository_url.split('/')[-2]
45
47
  pr_json = @api.pull_request(repo, pr)
46
48
  hocs = pr_json.additions + pr_json.deletions
47
49
  hoc += hocs
48
50
  loog.debug("Including #{repo}##{pr} with #{hocs}")
49
51
  end
50
52
  [
53
+ {
54
+ meta: true,
55
+ title: 'Orgs',
56
+ list: orgs
57
+ },
51
58
  {
52
59
  title: 'Pulls',
53
60
  total: total,
@@ -23,5 +23,5 @@
23
23
  # Copyright:: Copyright (c) 2022 Yegor Bugayenko
24
24
  # License:: MIT
25
25
  module Cobench
26
- VERSION = '0.0.28'.freeze
26
+ VERSION = '0.0.31'.freeze
27
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cobench
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.28
4
+ version: 0.0.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-02 00:00:00.000000000 Z
11
+ date: 2022-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '4.4'
125
+ - !ruby/object:Gem::Dependency
126
+ name: xcop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.6'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.6'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: codecov
127
141
  requirement: !ruby/object:Gem::Requirement