tdx 0.1 → 0.2

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: '094427fce2f4adf7f7771fddcd9e743e8be40e7a'
4
- data.tar.gz: 8da46abf56734d823cfd518bba1d7a19ff0a745e
3
+ metadata.gz: 75b7cfed6e48c402e1cedd1ab7ce10c236ebeacf
4
+ data.tar.gz: 637915bd109fd8cdf192ac58f3019cf114dc3ca2
5
5
  SHA512:
6
- metadata.gz: ea8b250773f7ae8b0e53a69d8e35ef928be212b6a82767d00baecc2989b4d39fd87cce3ad1764f9309ad82d798116013448629ae84cd34339cbefb0e0b4bea31
7
- data.tar.gz: 425317f013b2af729caec57079b05489c92e5af8fccee1c722d6b1327cba5c4269b98971452eeb13e102d5307fb2097480add320909c939c17a9140ec73bd032
6
+ metadata.gz: 357dbf0825dd394eb54c29a6ed89dedaa5d076f16cf5c5e3e2130bceb1ac4963fe389b2718f6f5a83f41da96527e662beb01063074ef42599b4181b7de7c8eb9
7
+ data.tar.gz: 7c79c8861cfb785ecca4d1da8dbe76675be1e730ffa2530d86a868feb81b468b4abd890ffeed38bcec8dacbe4d95ece15f567bca4ed550ec42f638e8badbd3d1
data/.rubocop.yml CHANGED
@@ -6,4 +6,12 @@ Metrics/MethodLength:
6
6
  Metrics/ClassLength:
7
7
  Max: 150
8
8
  Metrics/AbcSize:
9
- Max: 37
9
+ Max: 50
10
+ Style/MultilineMethodCallIndentation:
11
+ Enabled: false
12
+ Style/IndentationWidth:
13
+ Enabled: false
14
+ Style/ElseAlignment:
15
+ Enabled: false
16
+ Lint/EndAlignment:
17
+ Enabled: false
data/bin/tdx CHANGED
@@ -28,46 +28,17 @@ require 'tdx'
28
28
 
29
29
  args = ARGV
30
30
 
31
- opts = Slop.parse(args, strict: true, help: true) do
32
- banner "Usage (#{TDX::VERSION}): tdx [options]"
33
- on('version', 'Show current version')
34
- on(
35
- 'r',
36
- 'repo',
37
- 'Repository URI, e.g. "git@github.com:yegor256/tdx.git"',
38
- type: String,
39
- argument: :required,
40
- limit: 1
41
- )
42
- on(
43
- 'tests',
31
+ opts = Slop.parse(args, strict: true, help: true) do |o|
32
+ o.banner = "Usage (#{TDX::VERSION}): tdx [options] <GitHub URI> <SVG path>"
33
+ o.bool '-h', '--help', 'Show usage summary'
34
+ o.bool '-v', '--version', 'Show current version'
35
+ o.array(
36
+ '--tests',
44
37
  'Comma-separated list of relative paths with test-related files',
45
- type: String,
46
- argument: :required,
47
- limit: 1
48
- )
49
- on(
50
- 'login',
51
- 'GitHub login',
52
- argument: :required,
53
- type: String,
54
- limit: 1
55
- )
56
- on(
57
- 'password',
58
- 'GitHub password',
59
- argument: :required,
60
- type: String,
61
- limit: 1
62
- )
63
- on(
64
- 's',
65
- 'svg',
66
- 'Full path of the SVG file to generate (STDOUT otherwise)',
67
- argument: :required,
68
- type: String,
69
- limit: 1
38
+ delimiter: ','
70
39
  )
40
+ o.string '--login', 'GitHub login'
41
+ o.string '--password', 'GitHub password'
71
42
  end
72
43
 
73
44
  if opts.help?
@@ -80,11 +51,12 @@ if opts.version?
80
51
  exit
81
52
  end
82
53
 
54
+ if opts.arguments.length < 2
55
+ puts 'URI and SVG path are required'
56
+ exit
57
+ end
58
+
83
59
  Encoding.default_external = Encoding::UTF_8
84
60
  Encoding.default_internal = Encoding::UTF_8
85
- output = TDX::Base.new(opts).svg
86
- if opts[:svg]
87
- File.new(opts[:svg], 'w') << output
88
- else
89
- puts output
90
- end
61
+ output = TDX::Base.new(opts.arguments[0], opts).svg
62
+ File.new(opts.arguments[1], 'w') << output
data/features/cli.feature CHANGED
@@ -13,8 +13,7 @@ Feature: Command Line Processing
13
13
 
14
14
  Scenario: Simple SVG is built
15
15
  Given I have a Git repository in ./repo
16
- When I run bin/tdx with "--svg pic.svg --repo file://$(pwd)/repo"
17
- Then Stdout is empty
16
+ When I run bin/tdx with "file://$(pwd)/repo pic.svg"
18
17
  Then Exit code is zero
19
18
  And SVG is valid in "pic.svg"
20
19
 
data/lib/tdx/base.rb CHANGED
@@ -20,8 +20,11 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
+ require 'date'
23
24
  require 'yaml'
25
+ require 'octokit'
24
26
  require 'fileutils'
27
+ require 'English'
25
28
 
26
29
  # TDX main module.
27
30
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -30,12 +33,13 @@ require 'fileutils'
30
33
  module TDX
31
34
  # Base class
32
35
  class Base
33
- def initialize(opts)
36
+ def initialize(uri, opts)
37
+ @uri = uri
34
38
  @opts = opts
35
39
  end
36
40
 
37
41
  def svg
38
- dat = Tempfile.new('tdx.dat')
42
+ dat = Tempfile.new('tdx')
39
43
  version = `git --version`.split(/ /)[2]
40
44
  raise "git version #{version} is too old, upgrade it to 2.0+" unless
41
45
  Gem::Version.new(version) >= Gem::Version.new('2.0')
@@ -45,13 +49,17 @@ module TDX
45
49
  .split(/\n/)
46
50
  .map { |c| c.split(' ') }
47
51
  issues = issues(commits)
52
+ puts "Date\t\tTest\tHoC\tFiles\tLoC\tIssues\tSHA"
48
53
  commits.each do |sha, date|
49
54
  `cd "#{path}" && git checkout --quiet #{sha}`
50
- dat << "#{date} #{tests(path)} #{hoc(path)} #{files(path)}"
51
- dat << " #{loc(path)} #{issues[sha]}\n"
55
+ raise 'Failed to checkout' unless $CHILD_STATUS.exitstatus == 0
56
+ line = "#{date[0, 10]}\t#{tests(path)}\t#{hoc(path)}\t#{files(path)}\t\
57
+ #{loc(path)}\t#{issues[sha]}\t#{sha[0, 7]}"
58
+ dat << "#{line}\n"
59
+ puts line
52
60
  end
53
61
  dat.close
54
- svg = Tempfile.new('tdx.svg')
62
+ svg = Tempfile.new('tdx')
55
63
  gpi = [
56
64
  "set output \"#{svg.path}\"",
57
65
  'set terminal svg size 700, 260',
@@ -64,10 +72,17 @@ module TDX
64
72
  'set autoscale',
65
73
  'set style fill solid',
66
74
  'set boxwidth 0.75 relative',
67
- "plot \"#{dat.path}\" using 1:2 with boxes \
68
- title \"Test HoC\" linecolor rgb \"#81b341\""
75
+ [
76
+ "plot \"#{dat.path}\" using 1:2 with boxes",
77
+ 'title "Test HoC" linecolor rgb "#81b341"',
78
+ ', "" using 1:3 with boxes title "HoC" linecolor rgb "red"',
79
+ ', "" using 1:4 with boxes title "Files" linecolor rgb "black"',
80
+ ', "" using 1:5 with boxes title "LoC" linecolor rgb "cyan"',
81
+ ', "" using 1:6 with boxes title "Issues" linecolor rgb "orange"'
82
+ ].join(' ')
69
83
  ]
70
- `gnuplot -e '#{gpi.join(';')}' 2>/dev/null`
84
+ `gnuplot -e '#{gpi.join('; ')}'`
85
+ raise 'Failed to run Gnuplot' unless $CHILD_STATUS.exitstatus == 0
71
86
  FileUtils.rm_rf(path)
72
87
  File.delete(dat)
73
88
  xml = File.read(svg)
@@ -79,7 +94,12 @@ title \"Test HoC\" linecolor rgb \"#81b341\""
79
94
 
80
95
  def checkout
81
96
  dir = Dir.mktmpdir
82
- `cd #{dir} && git clone --quiet #{@opts[:repo]} .`
97
+ `cd #{dir} && git clone --quiet #{@uri} .`
98
+ raise 'Failed to clone repository' unless $CHILD_STATUS.exitstatus == 0
99
+ size = Dir.glob(File.join(dir, '**/*'))
100
+ .map(&:size)
101
+ .inject(0) { |a, e| a + e }
102
+ puts "Cloned #{@uri} (#{size / 1024}Kb) into temporary directory"
83
103
  dir
84
104
  end
85
105
 
@@ -88,7 +108,8 @@ title \"Test HoC\" linecolor rgb \"#81b341\""
88
108
  end
89
109
 
90
110
  def loc(path)
91
- cloc = `cd "#{path}" && cloc . --yaml --quiet 2>/dev/null`
111
+ cloc = `cd "#{path}" && cloc . --yaml --quiet`
112
+ raise 'Failed to run cloc' unless $CHILD_STATUS.exitstatus == 0
92
113
  yaml = YAML.load(cloc)
93
114
  if yaml
94
115
  yaml['SUM']['code']
@@ -98,17 +119,37 @@ title \"Test HoC\" linecolor rgb \"#81b341\""
98
119
  end
99
120
 
100
121
  def hoc(path)
101
- `cd "#{path}" && hoc`
122
+ hoc = `cd "#{path}" && hoc`
123
+ raise 'Failed to run hoc' unless $CHILD_STATUS.exitstatus == 0
124
+ hoc
102
125
  end
103
126
 
104
127
  def tests(path)
105
- `cd "#{path}" && hoc`
128
+ hoc = `cd "#{path}" && hoc`
129
+ raise 'Failed to run hoc' unless $CHILD_STATUS.exitstatus == 0
130
+ hoc
106
131
  end
107
132
 
108
133
  def issues(commits)
109
- dates = []
110
- # dates = github.issues.map{ |i| i.created_at }
111
- commits.map { |sha, date| [sha, dates.select { |d| d < date }.size] }.to_h
134
+ dates = if @uri.include?('github.com')
135
+ client = if @opts[:login]
136
+ Octokit::Client.new(login: @opts[:login], password: @opts[:password])
137
+ else
138
+ Octokit::Client.new
139
+ end
140
+ repo = if @uri.start_with?('git@')
141
+ @uri.gsub(/^git@github\.com:|\.git$/, '')
142
+ else
143
+ @uri.gsub(%r{^https://github\.com/|\.git$}, '')
144
+ end
145
+ client.list_issues(repo, state: :all).map(&:created_at)
146
+ else
147
+ []
148
+ end
149
+ commits.map do |sha, date|
150
+ iso = Time.parse(date)
151
+ [sha, dates.select { |d| d < iso }.size]
152
+ end.to_h
112
153
  end
113
154
  end
114
155
  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.1'.freeze
28
+ VERSION = '0.2'.freeze
29
29
  end
data/tdx.gemspec CHANGED
@@ -44,11 +44,13 @@ Gem::Specification.new do |s|
44
44
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
45
45
  s.rdoc_options = ['--charset=UTF-8']
46
46
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
47
- s.add_runtime_dependency 'slop', '~>3.6'
47
+ s.add_runtime_dependency 'slop', '~>4.4.1'
48
+ s.add_runtime_dependency 'octokit', '~>4.6.2'
48
49
  s.add_development_dependency 'rake', '12.0.0'
49
50
  s.add_development_dependency 'cucumber', '1.3.17'
50
51
  s.add_development_dependency 'coveralls', '0.7.2'
51
52
  s.add_development_dependency 'rubocop', '0.41.2'
53
+ s.add_development_dependency 'hoc', '0.8'
52
54
  s.add_development_dependency 'rubocop-rspec', '1.5.1'
53
55
  s.add_development_dependency 'minitest', '5.10.1'
54
56
  s.add_development_dependency 'nokogiri', '1.7.0.1'
data/test/test_tdx.rb CHANGED
@@ -35,7 +35,6 @@ class TestPDD < Minitest::Test
35
35
  Dir.mktmpdir 'test' do |dir|
36
36
  opts = opts(
37
37
  [
38
- '--repo', "file:///#{File.join(dir, 'repo')}",
39
38
  '--tests', 'tests'
40
39
  ]
41
40
  )
@@ -51,18 +50,27 @@ class TestPDD < Minitest::Test
51
50
  mkdir tests
52
51
  echo 'c = 3' > tests/3.py && git add tests/3.py && git commit -qam '3'
53
52
  ")
54
- assert(TDX::Base.new(opts).svg.include?('<path '))
53
+ assert(
54
+ TDX::Base.new(
55
+ "file:///#{File.join(dir, 'repo')}", opts
56
+ ).svg.include?('<path ')
57
+ )
55
58
  end
56
59
  end
57
60
 
61
+ def test_real_github_repo
62
+ assert(
63
+ TDX::Base.new(
64
+ 'https://github.com/yegor256/tdx.git', opts([])
65
+ ).svg.include?('<path ')
66
+ )
67
+ end
68
+
58
69
  private
59
70
 
60
71
  def opts(args)
61
- Slop.parse args do
62
- on 'p', 'path', argument: :required
63
- on 's', 'svg', argument: :required
64
- on 'r', 'repo', argument: :required
65
- on 't', 'tests', argument: :required
72
+ Slop.parse args do |o|
73
+ o.string '-t', '--tests', argument: :required
66
74
  end
67
75
  end
68
76
  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.1'
4
+ version: '0.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -16,14 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.6'
19
+ version: 4.4.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.6'
26
+ version: 4.4.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: octokit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.6.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.6.2
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - '='
81
95
  - !ruby/object:Gem::Version
82
96
  version: 0.41.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: hoc
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: '0.8'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: '0.8'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: rubocop-rspec
85
113
  requirement: !ruby/object:Gem::Requirement