Last active
April 3, 2024 09:20
-
-
Save well1791/b054b35bfabddce1b2d43e75188b4ca8 to your computer and use it in GitHub Desktop.
get_difference
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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