Skip to content

Instantly share code, notes, and snippets.

@well1791
Last active April 3, 2024 09:20
Show Gist options
  • Save well1791/b054b35bfabddce1b2d43e75188b4ca8 to your computer and use it in GitHub Desktop.
Save well1791/b054b35bfabddce1b2d43e75188b4ca8 to your computer and use it in GitHub Desktop.
get_difference
from typing import Union, List, TypedDict
import unittest
type Filenames = List[str]
type Action = TypedDict('Action', {
'added': Filenames,
'removed': Filenames,
})
def get_relevant_changes(list_of_actions: List[Action]) -> Action:
'''
Returns the resulting relevant changes of a list of actions
Parameters:
list_of_actions (List[Action]) = [
{ 'added': ['file1', 'file2'], 'removed': [] },
{ 'added': [], 'removed': ['file1', 'file2'] },
{ 'added': ['file2'], 'removed': ['file3'] },
]
Returns:
result (Action) = {
'added': [file2],
'removed': [file3],
}
'''
files = {}
for actions in list_of_actions:
for action, filenames in actions.items():
for fname in filenames:
files[fname] = files.get(fname, []) + [action]
result = {"added": [], "removed": []}
for fname, actions in files.items():
last_action = actions[-1]
if last_action != 'removed' or len(actions) <= 1:
result[last_action].append(fname)
return result
file1 = 'file1'
file2 = 'file2'
file3 = 'file3'
class TestGetDifference(unittest.TestCase):
def test_case_1(self):
data = [
{ "added": [], "removed": [file1] },
{ "added": [file1], "removed": [] },
]
expected = {'added': [file1], 'removed': []}
result = get_relevant_changes(data)
self.assertCountEqual(result['added'], expected['added'])
self.assertCountEqual(result['removed'], expected['removed'])
def test_case_2(self):
data = [
{ "added": [], "removed": [file1] },
{ "added": [file1], "removed": [] },
{ "added": [], "removed": [file1] },
]
expected = {'added': [], 'removed': []}
result = get_relevant_changes(data)
self.assertCountEqual(result['added'], expected['added'])
self.assertCountEqual(result['removed'], expected['removed'])
def test_case_3(self):
data = [
{ "added": [file1, file2], "removed": [] },
{ "added": [], "removed": [file1, file2] },
{ "added": [file2], "removed": [file3] },
]
expected = {'added': [file2], 'removed': [file3]}
result = get_relevant_changes(data)
self.assertCountEqual(result['added'], expected['added'])
self.assertCountEqual(result['removed'], expected['removed'])
def test_case_4(self):
data = [
{ "added": [file1], "removed": [] },
{ "added": [], "removed": [file2] },
{ "added": [], "removed": [file3] },
]
expected = {'added': [file1], 'removed': [file2, file3]}
result = get_relevant_changes(data)
self.assertCountEqual(result['added'], expected['added'])
self.assertCountEqual(result['removed'], expected['removed'])
def test_case_5(self):
data = [
{ "added": [], "removed": [file2] },
{ "added": [file2], "removed": [] },
{ "added": [], "removed": [file3] },
]
expected = {'added': [file2], 'removed': [file3]}
result = get_relevant_changes(data)
self.assertCountEqual(result['added'], expected['added'])
self.assertCountEqual(result['removed'], expected['removed'])
def test_case_6(self):
data = [
{ "added": [], "removed": [file1] },
{ "added": [file1], "removed": [file3] },
{ "added": [], "removed": [file1] },
]
expected = {'added': [], 'removed': [file3]}
result = get_relevant_changes(data)
self.assertCountEqual(result['added'], expected['added'])
self.assertCountEqual(result['removed'], expected['removed'])
def test_case_7(self):
data = [
{ "added": [file1], "removed": [] },
]
expected = {'added': [file1], 'removed': []}
result = get_relevant_changes(data)
self.assertCountEqual(result['added'], expected['added'])
self.assertCountEqual(result['removed'], expected['removed'])
if __name__ == '__main__':
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment