changelogerator 0.9.1 → 0.10.0

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: 8b7471810cc9cef7c45a8e3e299797131a6535eb3719160b27911f622ed9edc3
4
- data.tar.gz: 7ba7b175da8540b9faefba07510736f484380ae698aa910480c69de4647220c5
3
+ metadata.gz: a765967f91e3865aebe4990566bd73cdd310fde94ceade67ca4523486712752c
4
+ data.tar.gz: 722f348d22b0a44270a6289f1bcf9b48ecb4b5197e6b6f61eddd552058572ea5
5
5
  SHA512:
6
- metadata.gz: c1b900314ed34b4b90de73ad40ebc946aa4e60f40fc3ed9801ad840088739b654452fbe226cf9233bcb881cec2bc7e742c431554cbb2b81209decc769bb2acf9
7
- data.tar.gz: b413918b6710e7504f7ac1c750a1bdd1c00788f744c3168e25ff0ba85e1b6c13d985d368b3e50da8d872f047c3e072f6a656dbbda69e0e5a3749d2fe973ce02e
6
+ metadata.gz: 8331c26720ae5168575df385006c13d06dcf592b0250d97bd9d846d8f3cb697a5b82ddbf198fe180422d6e54dc5b05b0cba5a193c16cfc75bcf1849179d553ac
7
+ data.tar.gz: 9e7b6297c51b47965b103d5ba378a0cdbed04d1fe9cfa7f9190ed79f3d98a538945144bb75ffa78ddf1d71e276dd156f9fd455efb6ab08023e0daf0e7401ac1a
data/bin/changelogerator CHANGED
@@ -44,6 +44,13 @@ of the changes between 2 references on your Github project.
44
44
  puts opts
45
45
  exit
46
46
  end
47
+
48
+ opts.on('-V', '--version', 'Show the version') do
49
+ gemspec = "#{__dir__}/../changelogerator.gemspec"
50
+ gem = Gem::Specification.load(gemspec)
51
+ puts format('%<n>s v%<v>s', { v: gem.version, n: gem.name })
52
+ exit
53
+ end
47
54
  end.parse!
48
55
 
49
56
  @options[:repo] = ARGV[0]
data/lib/change.rb ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'label'
4
+
5
+ ### A class describe one change that can potentially have several labels
6
+ class Change
7
+ attr_reader :labels
8
+
9
+ def initialize(labels)
10
+ # Below we test if we got the full data from Octokit or
11
+ # only some fake data (label names only) from our tests.
12
+ @labels = labels.map do |label|
13
+ if label.respond_to?(:name)
14
+ from_octokit(label)
15
+ else
16
+ from_str(label)
17
+ end
18
+ end
19
+
20
+ @extra = {}
21
+ end
22
+
23
+ def []=(key, value)
24
+ @extra[key] = value
25
+ end
26
+
27
+ def meta
28
+ @extra['meta']
29
+ end
30
+
31
+ private
32
+
33
+ def from_octokit(label)
34
+ Label.new(label.name)
35
+ end
36
+
37
+ def from_str(label_name)
38
+ Label.new(label_name)
39
+ end
40
+ end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'label'
4
+ require 'change'
5
+
3
6
  # A small wrapper class for more easily generating and manipulating Github/Git
4
7
  # changelogs. Given two different git objects (sha, tag, whatever), it will
5
8
  # find all PRs that made up that diff and store them as a list. Also allows
@@ -32,13 +35,19 @@ class Changelog
32
35
  change._links = nil
33
36
 
34
37
  change[:meta].each_key do |meta_key|
35
- current = change[:meta][meta_key]
36
-
37
- meta[meta_key] = {} unless meta[meta_key]
38
- meta[meta_key][:min] = current[:value] if !meta[meta_key][:min] || current[:value] < meta[meta_key][:min]
39
- meta[meta_key][:max] = current[:value] if !meta[meta_key][:max] || current[:value] > meta[meta_key][:max]
40
- meta[meta_key][:count] = 0 unless meta[meta_key][:count]
41
- meta[meta_key][:count] += 1
38
+ aggregate = change[:meta][meta_key]['agg']
39
+
40
+ if meta[meta_key]
41
+ meta[meta_key][:min] = aggregate['min'] if aggregate['min'] < meta[meta_key][:min]
42
+ meta[meta_key][:max] = aggregate['max'] if aggregate['max'] > meta[meta_key][:max]
43
+ meta[meta_key][:count] += aggregate['count']
44
+ else
45
+ meta[meta_key] = {
46
+ min: aggregate['min'],
47
+ max: aggregate['max'],
48
+ count: aggregate['count']
49
+ }
50
+ end
42
51
  end
43
52
  end
44
53
  end
@@ -54,18 +63,6 @@ class Changelog
54
63
  nil
55
64
  end
56
65
 
57
- # Return the label code for a change
58
- # if the label name matches the expected pattern.
59
- # nil otherwise.
60
- def self.get_label_code(name)
61
- m = match = name.match(/^([a-z])(\d+)-(.*)$/i)
62
- if m
63
- letter, number, text = match.captures
64
- return [letter, number, text]
65
- end
66
- nil
67
- end
68
-
69
66
  ## End of class methods
70
67
 
71
68
  # github_repo: 'paritytech/polkadot'
@@ -83,16 +80,17 @@ class Changelog
83
80
  @repository = @gh.repository(@repo)
84
81
  @prefix = prefix
85
82
  ids = pr_ids_from_git_diff(from, to)
83
+ # The following takes very long time
86
84
  @changes = prs_from_ids(ids)
87
85
  @changes.map do |c|
88
- compute_change_meta(c)
86
+ self.class.compute_change_meta(c)
89
87
  end
90
88
 
91
89
  compute_global_meta
92
90
  end
93
91
 
94
92
  def add(change)
95
- compute_change_meta(change)
93
+ self.class.compute_change_meta(change)
96
94
  prettify_title(change)
97
95
  changes.prepend(change)
98
96
  @meta = compute_global_meta
@@ -123,25 +121,41 @@ class Changelog
123
121
  JSON.fast_generate(commits, opts)
124
122
  end
125
123
 
126
- private
127
-
128
124
  # Compute and attach metadata about one change
129
- def compute_change_meta(change)
125
+ def self.compute_change_meta(change)
130
126
  meta = {}
131
127
 
132
- change.labels.each do |label|
133
- letter, number, text = self.class.get_label_code(label.name)
134
- next unless letter && number
128
+ change.labels.each do |lbl|
129
+ label = Label.new(lbl.name)
130
+
131
+ next unless label
132
+
133
+ if meta.key?(label.letter)
134
+ aggregate = meta[label.letter]['agg']
135
+ aggregate['max'] = label.number if label.number > aggregate['max']
136
+ aggregate['min'] = label.number if label.number < aggregate['min']
137
+ aggregate['count'] += 1
138
+ else
139
+ meta[label.letter] = {
140
+ 'agg' => {
141
+ 'count' => 1,
142
+ 'max' => label.number,
143
+ 'min' => label.number
144
+ }
145
+ }
146
+ end
135
147
 
136
- meta[letter] = {
137
- value: number.to_i,
138
- text: text
148
+ meta[label.letter]["#{label.letter}#{label.number}"] = {
149
+ 'value' => label.number,
150
+ 'text' => label.description
139
151
  }
140
152
  end
141
153
 
142
154
  change['meta'] = meta
143
155
  end
144
156
 
157
+ private
158
+
145
159
  # Prepend the repo if @prefix is true
146
160
  def prettify_title(pull)
147
161
  pull[:pretty_title] = if @prefix
@@ -163,6 +177,7 @@ class Changelog
163
177
  end.compact.map(&:to_i)
164
178
  end
165
179
 
180
+ # TODO: See if we can make this quicker
166
181
  def prs_from_ids(ids)
167
182
  batch_size = 100
168
183
  prs = []
data/lib/label.rb ADDED
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ ### Label = Letter + Number [+ Description]
4
+ class Label
5
+ attr_accessor :letter, :number, :description
6
+
7
+ # Return the label letter for a change if the label name matches the expected pattern.
8
+ # nil otherwise.
9
+ def parse(label)
10
+ m = match = label.match(/^([a-z])(\d+)\s*-?\s*(.*)$/i)
11
+ return nil unless m
12
+
13
+ letter, digits, text = match.captures
14
+ number = digits.to_i
15
+ [letter, number, text]
16
+ end
17
+
18
+ def initialize(input)
19
+ raise InvalidInput, 'Invalid, it must be a non-empty string' unless input
20
+
21
+ p = parse(input)
22
+ raise InvalidLabel, format('Invalid label "%<input>s"', { input: input }) unless p
23
+
24
+ @letter = p[0].upcase
25
+ @number = p[1]
26
+ @description = p[2] unless p[2].empty?
27
+ end
28
+
29
+ ### Implemented for compatibility reasons
30
+ def name
31
+ to_str
32
+ end
33
+
34
+ def to_str
35
+ format('%<l>s%<n>d - %<d>s', { l: @letter, n: @number, d: @description })
36
+ end
37
+ end
38
+
39
+ class InvalidLabel < StandardError; end
40
+
41
+ class InvalidInput < StandardError; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: changelogerator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Pugh
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-11-11 00:00:00.000000000 Z
12
+ date: 2023-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: git_diff_parser
@@ -48,11 +48,14 @@ extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
50
  - bin/changelogerator
51
+ - lib/change.rb
51
52
  - lib/changelogerator.rb
53
+ - lib/label.rb
52
54
  homepage: https://github.com/s3krit/changelogerator
53
55
  licenses:
54
56
  - AGPL-3.0
55
- metadata: {}
57
+ metadata:
58
+ rubygems_mfa_required: 'true'
56
59
  post_install_message:
57
60
  rdoc_options: []
58
61
  require_paths:
@@ -68,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
71
  - !ruby/object:Gem::Version
69
72
  version: '0'
70
73
  requirements: []
71
- rubygems_version: 3.2.22
74
+ rubygems_version: 3.2.33
72
75
  signing_key:
73
76
  specification_version: 4
74
77
  summary: Changelog generation/management