Skip to content

Commit

Permalink
allow for multiple items with the same starting letter on meta
Browse files Browse the repository at this point in the history
  • Loading branch information
joao-paulo-parity committed Feb 10, 2023
1 parent 81e8a96 commit 78605c4
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 48 deletions.
73 changes: 44 additions & 29 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 @@ -54,18 +98,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 +157,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
62 changes: 48 additions & 14 deletions test/test_meta.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,61 @@

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
)
p change.meta.to_json

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(%w[A B], change.meta.keys)

p cl.meta
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

puts format('JSON Length: %d', j.length)
assert(j.length > 11_000)
assert(j.length < 13_000)
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

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

0 comments on commit 78605c4

Please sign in to comment.