Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
78605c4
allow for multiple items with the same starting letter on meta
joao-paulo-parity Feb 10, 2023
8589e5b
remove unnecessary print
joao-paulo-parity Feb 10, 2023
6bfabdf
bump version for breaking change
joao-paulo-parity Feb 10, 2023
5cec100
fix global meta usage
joao-paulo-parity Feb 10, 2023
ec417e3
fix global meta assignments
joao-paulo-parity Feb 10, 2023
7f95009
re-add comment on compute_change_meta
joao-paulo-parity Feb 14, 2023
fcbd198
refactor $GITHUB_TOKEN checks
joao-paulo-parity Feb 14, 2023
9341786
refactor $GITHUB_TOKEN checks
joao-paulo-parity Feb 14, 2023
a066bd7
bump version to 3.0.5 and add MFA
chevdor Feb 14, 2023
1439f0d
Extract a Label class and add some tests
chevdor Feb 14, 2023
879d391
Add error handling
chevdor Feb 14, 2023
7934dbf
Avoid skipping tests that could run
chevdor Feb 14, 2023
c5942aa
set GITHUB_TOKEN=disabled for pull requests on CI
joao-paulo-parity Feb 14, 2023
a3c3567
Merge branch 'jp/meta' of github.com:paritytech/changelogerator into …
joao-paulo-parity Feb 14, 2023
1577956
fix if expression
joao-paulo-parity Feb 14, 2023
ec43e6a
fix if expression
joao-paulo-parity Feb 14, 2023
0906060
Fix readme
chevdor Feb 14, 2023
54770bd
Remove some polkadot/srtool specifics
chevdor Feb 14, 2023
140602d
update README example
joao-paulo-parity Feb 14, 2023
ecc0826
Merge branch 'jp/meta' of github.com:paritytech/changelogerator into …
joao-paulo-parity Feb 14, 2023
4cbf9d6
improve comments
joao-paulo-parity Feb 14, 2023
27d21e2
Add new test
chevdor Feb 14, 2023
d3be4b3
Refactoring for better irb support
chevdor Feb 15, 2023
85a1710
Fix so both local and online tests work
chevdor Feb 15, 2023
c905262
Add new flag to return the version
chevdor Feb 15, 2023
0de7e51
Fix packaging
chevdor Feb 15, 2023
fb98671
disable lint
joao-paulo-parity Feb 15, 2023
9315a1c
Fix location of the gemspec
chevdor Feb 15, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion changelogerator.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Gem::Specification.new do |s|
s.name = 'changelogerator'
s.version = '0.9.1'
s.version = '0.10.0'
s.summary = 'Changelog generation/management'
s.authors = ['Martin Pugh', 'Wilfried Kopp']
s.files = ['lib/changelogerator.rb', 'bin/changelogerator']
Expand Down
93 changes: 57 additions & 36 deletions lib/changelogerator.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,49 @@
# frozen_string_literal: true

# Return the label code for a change
# if the label name matches the expected pattern.
# nil otherwise.
def parse_change_label(name)
m = match = name.match(/^([a-z])(\d+)-(.*)$/i)
return nil unless m

letter, digits, text = match.captures
number = digits.to_i
[letter, number, text]
end

def compute_change_meta(change)
meta = {}

change.labels.each do |label|
letter, number, text = parse_change_label(label.name)

next unless letter && number

if meta.key?(letter)
aggregate = meta[letter]['agg']
aggregate['max'] = number if number > aggregate['max']
aggregate['min'] = number if number < aggregate['min']
aggregate['count'] += 1
else
meta[letter] = {
'agg' => {
'count' => 1,
'max' => number,
'min' => number
}
}
end

meta[letter]["#{letter}#{number}"] = {
'value' => number,
'text' => text
}
end

change['meta'] = meta
end

# A small wrapper class for more easily generating and manipulating Github/Git
# changelogs. Given two different git objects (sha, tag, whatever), it will
# find all PRs that made up that diff and store them as a list. Also allows
Expand Down Expand Up @@ -32,13 +76,19 @@ def compute_global_meta
change._links = nil

change[:meta].each_key do |meta_key|
current = change[:meta][meta_key]

meta[meta_key] = {} unless meta[meta_key]
meta[meta_key][:min] = current[:value] if !meta[meta_key][:min] || current[:value] < meta[meta_key][:min]
meta[meta_key][:max] = current[:value] if !meta[meta_key][:max] || current[:value] > meta[meta_key][:max]
meta[meta_key][:count] = 0 unless meta[meta_key][:count]
meta[meta_key][:count] += 1
aggregate = change[:meta][meta_key]['agg']

if meta[meta_key]
meta[meta_key][:min] = aggregate['min'] if aggregate['min'] < meta[meta_key][:min]
meta[meta_key][:max] = aggregate['max'] if aggregate['max'] > meta[meta_key][:max]
meta[meta_key][:count] += aggregate['count']
else
meta[meta_key] = {
min: aggregate['min'],
max: aggregate['max'],
count: aggregate['count']
}
end
end
end
end
Expand All @@ -54,18 +104,6 @@ def self.changes_files_in_paths?(change, paths)
nil
end

# Return the label code for a change
# if the label name matches the expected pattern.
# nil otherwise.
def self.get_label_code(name)
m = match = name.match(/^([a-z])(\d+)-(.*)$/i)
if m
letter, number, text = match.captures
return [letter, number, text]
end
nil
end

## End of class methods

# github_repo: 'paritytech/polkadot'
Expand Down Expand Up @@ -125,23 +163,6 @@ def to_json(*_args)

private

# Compute and attach metadata about one change
def compute_change_meta(change)
meta = {}

change.labels.each do |label|
letter, number, text = self.class.get_label_code(label.name)
next unless letter && number

meta[letter] = {
value: number.to_i,
text: text
}
end

change['meta'] = meta
end

# Prepend the repo if @prefix is true
def prettify_title(pull)
pull[:pretty_title] = if @prefix
Expand Down
6 changes: 6 additions & 0 deletions test/test_basic.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

class TestChangelogerator < Test::Unit::TestCase
def test_polkadot_1_commit
return unless ENV['GITHUB_TOKEN']

ref1 = '2ebabcec7fcbb3d13a965a852df0559a4aa12a5e'
ref2 = '9c05f9753b2f939ccf5ba18c08dd4c83c3ab9e0b'
cl = Changelog.new(
Expand All @@ -22,6 +24,8 @@ def test_polkadot_1_commit
end

def test_polkadot_many_commits
return unless ENV['GITHUB_TOKEN']

ref1 = 'v0.9.8'
ref2 = 'v0.9.11'
cl = Changelog.new(
Expand All @@ -39,6 +43,8 @@ def test_polkadot_many_commits
end

def test_cumulus_many_commits
return unless ENV['GITHUB_TOKEN']

ref1 = 'statemine-v1.0.0'
ref2 = 'statemine_v4'
cl = Changelog.new(
Expand Down
10 changes: 5 additions & 5 deletions test/test_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@

class TestChangelogerator < Test::Unit::TestCase
def test_helpers
letter, number, text = Changelog.get_label_code('B2-test')
letter, number, text = parse_change_label('B2-test')
assert_equal('B', letter)
assert_equal('2', number)
assert_equal(2, number)
assert_equal('test', text)

letter, number, text = Changelog.get_label_code('Z44-test 😁')
letter, number, text = parse_change_label('Z44-test 😁')
assert_equal('Z', letter)
assert_equal('44', number)
assert_equal(44, number)
assert_equal('test 😁', text)

letter, number, text = Changelog.get_label_code('123-foo')
letter, number, text = parse_change_label('123-foo')
assert_equal(nil, letter)
assert_equal(nil, number)
assert_equal(nil, text)
Expand Down
60 changes: 46 additions & 14 deletions test/test_meta.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,59 @@

require 'json'
require_relative '../lib/changelogerator'
require_relative './utils'
require 'test/unit'

class TestChangelogerator < Test::Unit::TestCase
def test_meta_1_commit
ref1 = '2ebabcec7fcbb3d13a965a852df0559a4aa12a5e'
ref2 = '9c05f9753b2f939ccf5ba18c08dd4c83c3ab9e0b'
change = Change.new(%w[A1-foo A2-foo B0-foo B1-foo B2-foo])
compute_change_meta(change)

cl = Changelog.new(
'paritytech/polkadot', ref1, ref2,
token: ENV['GITHUB_TOKEN'],
prefix: true
)
assert_equal(%w[A B], change.meta.keys)

j = cl.to_json
assert_equal(1, cl.changes.length)
assert_equal(%w[A B C], cl.changes[0].meta.keys) # A2 + B0 + C1
assert_equal(change.meta['A']['agg']['min'], 1) # A(1)
assert_equal(change.meta['A']['agg']['max'], 2) # A(2)
assert_equal(change.meta['A']['agg']['count'], 2) # A1 + A2

p cl.meta
assert_equal(change.meta['B']['agg']['min'], 0) # B(0)
assert_equal(change.meta['B']['agg']['max'], 2) # B(2)
assert_equal(change.meta['B']['agg']['count'], 3) # B0 + B1 + B2

puts format('JSON Length: %d', j.length)
assert(j.length > 11_000)
assert(j.length < 13_000)
assert_equal(JSON.pretty_generate(change.meta), '{
"A": {
"agg": {
"count": 2,
"max": 2,
"min": 1
},
"A1": {
"value": 1,
"text": "foo"
},
"A2": {
"value": 2,
"text": "foo"
}
},
"B": {
"agg": {
"count": 3,
"max": 2,
"min": 0
},
"B0": {
"value": 0,
"text": "foo"
},
"B1": {
"value": 1,
"text": "foo"
},
"B2": {
"value": 2,
"text": "foo"
}
}
}')
end
end
28 changes: 28 additions & 0 deletions test/utils.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

class Change
attr_reader :labels

class Label
attr_reader :name

def initialize(name)
@name = name
end
end

def initialize(labels)
@labels = labels.map do |label|
Label.new(label)
end
@extra = {}
end

def []=(key, value)
@extra[key] = value
end

def meta
@extra['meta']
end
end