diggit 3.0.2 → 3.0.3

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
  SHA256:
3
- metadata.gz: 2e5d600c1a153b908c21f736888189e787cd37b9dfe8b825dd2b09e6d87d3504
4
- data.tar.gz: be325f5cfb4e9145e8e6d5b527c4a518f6852687849028e7c4ce06fcbb39e0e2
3
+ metadata.gz: c85e3eadbde6b35542b116a284a6c1b1bba40f0e92dc902c407deb3098d26c02
4
+ data.tar.gz: c941389bb90f76bc46ac997a574220dea844034692f080134b73db31f9e0feea
5
5
  SHA512:
6
- metadata.gz: 39fca80590e7d9c00936319c5363605fd7e8b9653d200c638b082f4da3a6efa17bfd3c11e5e211a3e8392702beb3c9e4e9f7e7414df5542afcdde4e4a042b09e
7
- data.tar.gz: 58660bd365187ac0d816571bd5d7078202a8a0a7401f405f4afad567e82275432334202300d52509c392e8aedcbea5dd24978d328e8c49099db1e04403dddc82
6
+ metadata.gz: a411fab663670f3662124714fb17eb40b8e5f5d715b6919ccafa1f257884f791c756ed03923ef01aaad67c3718c924e6efd79ee462ca38ab9d0bf3b36ec50d90
7
+ data.tar.gz: 50845221483a94d5a8527f532e9a951f28e991ad7497ff4ddf83e7b6002f933bb36e534daf0e1ed5ab54b654f9963817b123650c14212baf5501a08faddb180e
@@ -1,5 +1,10 @@
1
1
  # Changelog of Diggit
2
2
 
3
+ ### Version 3.0.3
4
+ * New yard analysis
5
+ * Add code of conduct
6
+ * Fix bug with oid being erased in .dgit/sources
7
+
3
8
  ### Version 3.0.2
4
9
  * Added version command
5
10
  * `out` plugin is now able to furnish and clean folder dedicated for an analysis bound to a source
@@ -74,6 +74,11 @@ module Diggit
74
74
  @repository = nil
75
75
  end
76
76
 
77
+ def full_url
78
+ return @url if @oid.eql?(DEFAULT_BRANCH)
79
+ "#{@url}|#{@oid}"
80
+ end
81
+
77
82
  def id
78
83
  @url.id
79
84
  end
@@ -386,7 +391,7 @@ module Diggit
386
391
  # Save the journal to `.dgit/journal`
387
392
  # @return [void]
388
393
  def save_journal
389
- File.open(config_path(DGIT_SOURCES), "w") { |f| @journal.sources.each { |source| f.puts(source.url) } }
394
+ File.open(config_path(DGIT_SOURCES), "w") { |f| @journal.sources.each { |source| f.puts(source.full_url) } }
390
395
  Oj.to_file(config_path(DGIT_JOURNAL), @journal)
391
396
  end
392
397
 
@@ -16,5 +16,5 @@
16
16
  # Copyright 2015 Jean-Rémy Falleri <jr.falleri@gmail.com>
17
17
 
18
18
  module Diggit
19
- VERSION = '3.0.2'.freeze
19
+ VERSION = '3.0.3'.freeze
20
20
  end
@@ -0,0 +1,119 @@
1
+ # This file is part of Diggit.
2
+ #
3
+ # Diggit is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU Lesser General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # Diggit is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public License
14
+ # along with Diggit. If not, see <http://www.gnu.org/licenses/>.
15
+ #
16
+ # Copyright 2018 Jean-Rémy Falleri <jr.falleri@gmail.com>
17
+
18
+ require 'yaml'
19
+ require 'yard'
20
+ require 'levenshtein'
21
+ require 'gruff'
22
+
23
+ # List all yardoc duplications
24
+ class YardDup < Diggit::Analysis
25
+ require_addons 'out'
26
+
27
+ def initialize(options)
28
+ super(options)
29
+ end
30
+
31
+ def run
32
+ Log.info "processing yardoc of #{@source.id}"
33
+ out_dir = out.out_path_for_analysis(self)
34
+ FileUtils.mkdir_p(out_dir)
35
+ doc_hash = {}
36
+ YARD::Registry.clear
37
+ YARD::Registry.load(Dir["#{source.folder}/**/*.rb"], true)
38
+ objects = YARD::Registry.all(:method)
39
+ Log.info "processing #{objects.size} documented methods"
40
+ objects.each do |obj|
41
+ insert_to_map("@main #{obj.docstring}", doc_hash, obj) unless obj.docstring.empty?
42
+ obj.tags.each do |tag|
43
+ next if tag.nil?
44
+ tag_tokens = []
45
+ tag_tokens << "@#{tag.tag_name}" unless tag.tag_name.nil?
46
+ tag_tokens << tag.types.join(',') unless tag.types.nil? || tag.types.empty?
47
+ tag_tokens << tag.text unless tag.text.nil?
48
+ insert_to_map(tag_tokens.join(' '), doc_hash, obj)
49
+ end
50
+ end
51
+ write_duplications(File.join(out_dir, "duplications.txt"), doc_hash)
52
+ puts_duplicated_methods(doc_hash)
53
+ plot_duplications(File.join(out_dir, "duplications.png"), doc_hash)
54
+ write_near_miss(File.join(out_dir, "near-miss.txt"), doc_hash)
55
+ end
56
+
57
+ def similarity(s1, s2)
58
+ d_norm = Levenshtein.distance(s1, s2).to_f / [s1.size.to_f, s2.size.to_f].max
59
+ 1 - d_norm
60
+ end
61
+
62
+ def puts_duplicated_methods(doc_hash)
63
+ obj_hash = {}
64
+ doc_hash.each_value do |value|
65
+ value.each { |obj| obj_hash[obj] = true } if value.size > 2
66
+ end
67
+ Log.info "#{obj_hash.each_key.to_a.size} method involved in duplications"
68
+ end
69
+
70
+ def write_duplications(file, doc_hash)
71
+ File.open(file, 'w') do |f|
72
+ doc_hash.each { |key, value| f.write "#{key} (#{value.size}) #{value}\n" if value.size > 1 }
73
+ end
74
+ end
75
+
76
+ def plot_duplications(file, doc_hash)
77
+ dup_hash = {}
78
+ doc_hash.each_value do |value|
79
+ dup_hash[value.size] = if dup_hash.key?(value.size)
80
+ dup_hash[value.size] + 1
81
+ else
82
+ 1
83
+ end
84
+ end
85
+ g = Gruff::Bar.new
86
+ g.hide_legend = true
87
+ dup_numbers = 2..dup_hash.each_key.to_a.max
88
+ dup_numbers.each do |dup|
89
+ if dup_hash.key?(dup)
90
+ g.data(dup, dup_hash[dup])
91
+ else
92
+ g.data(dup, 0)
93
+ end
94
+ end
95
+ g.write(file)
96
+ end
97
+
98
+ def write_near_miss(file, doc_hash)
99
+ keys = doc_hash.each_key.to_a
100
+ return if keys.size < 2
101
+ File.open(file, 'w') do |f|
102
+ (0..(keys.size - 2)).each do |i|
103
+ key1 = keys[i]
104
+ key2 = keys[i + 1]
105
+ sim = similarity(key1, key2)
106
+ f.write "(#{sim}) #{key1} || #{key2}\n" if sim > 0.8
107
+ end
108
+ end
109
+ end
110
+
111
+ def insert_to_map(key, hash, obj)
112
+ hash[key] = [] unless hash.key?(key)
113
+ hash[key] << "#{obj.file} #{obj.path}"
114
+ end
115
+
116
+ def clean
117
+ out.clean_analysis(self)
118
+ end
119
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diggit
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Rémy Falleri
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-01-27 00:00:00.000000000 Z
14
+ date: 2018-02-13 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: formatador
@@ -211,6 +211,7 @@ files:
211
211
  - plugins/analysis/conflict_merge.rb
212
212
  - plugins/analysis/javadoc.rb
213
213
  - plugins/analysis/words.rb
214
+ - plugins/analysis/yard_dup.rb
214
215
  - spec/cli_spec.rb
215
216
  - spec/core_spec.rb
216
217
  - spec/dgit/plugins/addon/test_addon.rb
@@ -247,7 +248,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
248
  version: '0'
248
249
  requirements: []
249
250
  rubyforge_project:
250
- rubygems_version: 2.7.4
251
+ rubygems_version: 2.7.5
251
252
  signing_key:
252
253
  specification_version: 4
253
254
  summary: A Git repository analysis tool.