From 3376731a5b13a74d3fc25bdd92cfce77381ac1d0 Mon Sep 17 00:00:00 2001 From: Olaf Szmidt Date: Thu, 23 Aug 2018 14:34:00 +0100 Subject: [PATCH 1/5] Start removing log references --- .../tests/test_simulation/fake_game_runner.py | 2 - aimmo-game/tests/test_simulation/test_logs.py | 39 ------------------- .../test_simulation/test_turn_manager.py | 2 - 3 files changed, 43 deletions(-) delete mode 100644 aimmo-game/tests/test_simulation/test_logs.py diff --git a/aimmo-game/tests/test_simulation/fake_game_runner.py b/aimmo-game/tests/test_simulation/fake_game_runner.py index 1cdda0798..ded1634a8 100644 --- a/aimmo-game/tests/test_simulation/fake_game_runner.py +++ b/aimmo-game/tests/test_simulation/fake_game_runner.py @@ -3,7 +3,6 @@ from simulation.turn_manager import ConcurrentTurnManager from simulation.map_generator import Main -from simulation.logs import Logs from simulation.avatar.avatar_manager import AvatarManager from simulation.game_runner import GameRunner from .concrete_worker_manager import ConcreteWorkerManager @@ -19,7 +18,6 @@ def __init__(self, settings=None, player_manager=None): settings = {'START_WIDTH': 3, 'START_HEIGHT': 3, 'OBSTACLE_RATIO': 0} self.settings = settings - self.logs = Logs() self.map_generator = Main(settings) if not player_manager: self.player_manager = AvatarManager() diff --git a/aimmo-game/tests/test_simulation/test_logs.py b/aimmo-game/tests/test_simulation/test_logs.py deleted file mode 100644 index dfd9a25c0..000000000 --- a/aimmo-game/tests/test_simulation/test_logs.py +++ /dev/null @@ -1,39 +0,0 @@ -import mock -from unittest import TestCase -from .fake_game_runner import FakeGameRunner -from .dummy_avatar import DummyAvatarManager -from simulation.logs import Logs - - -class TestLogs(TestCase): - - def test_log_provider_setting_logs(self): - logs = Logs() - self.assertEqual(len(logs._logs), 0) - - logs.set_user_logs(user_id=1, logs="test logs") - self.assertEqual(len(logs._logs), 1) - self.assertIn(1, logs._logs) - self.assertEqual(logs._logs[1], "test logs") - - def test_log_provider_getting_logs(self): - logs = Logs() - logs.set_user_logs(user_id=1, logs="test logs") - - success_logs = logs.get_user_logs(1) - failed_logs = logs.get_user_logs(50) - - self.assertEqual(success_logs, "test logs") - self.assertIsNone(failed_logs) - - def test_turn_manager_calls_set_user_logs(self): - dummy_avatar_manager = DummyAvatarManager() - fake_game_runner = FakeGameRunner(player_manager=dummy_avatar_manager) - fake_game_runner.logs.set_user_logs = mock.MagicMock() - - fake_game_runner.run_single_turn() - - first_call = mock.call(logs='Testing', user_id=1) - second_call = mock.call(logs='Testing', user_id=2) - - fake_game_runner.logs.set_user_logs.assert_has_calls([first_call, second_call]) diff --git a/aimmo-game/tests/test_simulation/test_turn_manager.py b/aimmo-game/tests/test_simulation/test_turn_manager.py index f9601a17c..0e187e707 100644 --- a/aimmo-game/tests/test_simulation/test_turn_manager.py +++ b/aimmo-game/tests/test_simulation/test_turn_manager.py @@ -6,7 +6,6 @@ from simulation.game_state import GameState from simulation.location import Location from simulation.turn_manager import ConcurrentTurnManager -from simulation.logs import Logs from .dummy_avatar import (DummyAvatarManager, MoveEastDummy, MoveNorthDummy, MoveSouthDummy, MoveWestDummy, WaitDummy, DeadDummy) @@ -46,7 +45,6 @@ def construct_turn_manager(self, avatars, locations): self.turn_manager = ConcurrentTurnManager(game_state=self.game_state, end_turn_callback=lambda: None, communicator=MockCommunicator(), - logs=Logs(), have_avatars_code_updated={}) for index, location in enumerate(locations): self.game_state.add_avatar(index, "", location) From 311cb2fcf4e383a0820bfa1538382e7c7ecd2289 Mon Sep 17 00:00:00 2001 From: Olaf Szmidt Date: Thu, 23 Aug 2018 16:36:27 +0100 Subject: [PATCH 2/5] Write some initial test changes --- aimmo-game/service.py | 1 - aimmo-game/simulation/game_runner.py | 7 ++- aimmo-game/simulation/simulation_runner.py | 2 +- aimmo-game/tests/test_service.py | 2 +- .../avatar/test_avatar_wrapper.py | 9 ++-- .../tests/test_simulation/dummy_avatar.py | 6 ++- .../tests/test_simulation/fake_game_runner.py | 52 ------------------- .../test_simulation/test_avatar_location.py | 22 -------- .../tests/test_simulation/test_game_runner.py | 26 +++++----- .../tests/test_simulation/test_game_state.py | 8 +-- .../test_simulation/test_map_generator.py | 6 +-- .../test_simulation/test_turn_manager.py | 36 ++++++------- aimmo-game/tests/test_socketio.py | 7 ++- 13 files changed, 58 insertions(+), 126 deletions(-) delete mode 100644 aimmo-game/tests/test_simulation/fake_game_runner.py delete mode 100644 aimmo-game/tests/test_simulation/test_avatar_location.py diff --git a/aimmo-game/service.py b/aimmo-game/service.py index 61f350780..319b0b6fa 100644 --- a/aimmo-game/service.py +++ b/aimmo-game/service.py @@ -14,7 +14,6 @@ from simulation import map_generator from simulation.avatar.avatar_manager import AvatarManager from simulation.worker_managers import WORKER_MANAGERS -from simulation.communicator import Communicator from simulation.game_runner import GameRunner eventlet.sleep() diff --git a/aimmo-game/simulation/game_runner.py b/aimmo-game/simulation/game_runner.py index 0b3085797..8027e84a5 100644 --- a/aimmo-game/simulation/game_runner.py +++ b/aimmo-game/simulation/game_runner.py @@ -61,9 +61,12 @@ def update_simulation(self, player_id_to_serialised_actions): self.simulation_runner.run_single_turn(player_id_to_serialised_actions) self.end_turn_callback() - def run(self): - while True: + def update(self): self.update_workers() self.update_simulation(self.worker_manager.get_player_id_to_serialised_actions()) self.worker_manager.clear_logs() + + def run(self): + while True: + self.update() time.sleep(TURN_TIME) diff --git a/aimmo-game/simulation/simulation_runner.py b/aimmo-game/simulation/simulation_runner.py index 40a55fe28..64e92ed21 100644 --- a/aimmo-game/simulation/simulation_runner.py +++ b/aimmo-game/simulation/simulation_runner.py @@ -15,7 +15,7 @@ class SimulationRunner(object): """ daemon = True - def __init__(self, communicator, game_state,): + def __init__(self, game_state, communicator): self.game_state = game_state self.communicator = communicator diff --git a/aimmo-game/tests/test_service.py b/aimmo-game/tests/test_service.py index 9641420ed..f63df1475 100644 --- a/aimmo-game/tests/test_service.py +++ b/aimmo-game/tests/test_service.py @@ -16,7 +16,7 @@ class DummyAvatarManager(AvatarManager): @classmethod def setUpClass(cls): """ Register the api endpoints """ - cls.game_api = service.GameAPI(worker_manager=None, game_state=None, logs=None, have_avatars_code_updated=None) + cls.game_api = service.GameAPI(worker_manager=None, game_state=None) def setUp(self): """ diff --git a/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py b/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py index 396782b50..ad3ef7583 100644 --- a/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py +++ b/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py @@ -6,7 +6,7 @@ from simulation.avatar import avatar_wrapper from simulation.location import Location - +from simulation.worker import Worker class MockEffect(object): def __init__(self, avatar): @@ -60,13 +60,16 @@ class TestAvatarWrapper(TestCase): def setUp(self): global actions_created actions_created = [] - self.avatar = avatar_wrapper.AvatarWrapper(None, None, 'http://test', None) + self.worker = Worker(worker_url='http://test') + self.avatar = avatar_wrapper.AvatarWrapper(player_id=None, + initial_location=None, + avatar_appearance=None) def take_turn(self, request_mock=None): if request_mock is None: request_mock = ActionRequest() with HTTMock(request_mock): - worker_data = self.avatar.fetch_data(None) + worker_data = self.worker.fetch_data(None) self.avatar.decide_action(worker_data) def test_action_has_created_correctly(self): diff --git a/aimmo-game/tests/test_simulation/dummy_avatar.py b/aimmo-game/tests/test_simulation/dummy_avatar.py index 6910e5168..b11f0a18b 100644 --- a/aimmo-game/tests/test_simulation/dummy_avatar.py +++ b/aimmo-game/tests/test_simulation/dummy_avatar.py @@ -12,7 +12,9 @@ class DummyAvatar(AvatarWrapper): def __init__(self, player_id=1, initial_location=(0, 0)): # TODO: extract avatar state and state-altering methods into a new class. # The new class is to be shared between DummyAvatarRunner and AvatarRunner - super(DummyAvatar, self).__init__(player_id, initial_location, None, None) + super(DummyAvatar, self).__init__(player_id, + initial_location, + avatar_appearance=None) self.times_died = 0 self.attack_strength = 1 self.effects = set() @@ -115,7 +117,7 @@ def __init__(self, dummy_list=None): dummy_list = [] self.dummy_list = dummy_list - def add_avatar(self, player_id, worker_url, location): + def add_avatar(self, player_id, location=(0, 0)): try: dummy = self.dummy_list.pop(0) except IndexError: diff --git a/aimmo-game/tests/test_simulation/fake_game_runner.py b/aimmo-game/tests/test_simulation/fake_game_runner.py deleted file mode 100644 index ded1634a8..000000000 --- a/aimmo-game/tests/test_simulation/fake_game_runner.py +++ /dev/null @@ -1,52 +0,0 @@ -import random -import logging - -from simulation.turn_manager import ConcurrentTurnManager -from simulation.map_generator import Main -from simulation.avatar.avatar_manager import AvatarManager -from simulation.game_runner import GameRunner -from .concrete_worker_manager import ConcreteWorkerManager -from .mock_communicator import MockCommunicator - -LOGGER = logging.getLogger(__name__) - - -class FakeGameRunner(object): - def __init__(self, settings=None, player_manager=None): - # Default argument is now immutable - if settings is None: - settings = {'START_WIDTH': 3, 'START_HEIGHT': 3, 'OBSTACLE_RATIO': 0} - - self.settings = settings - self.map_generator = Main(settings) - if not player_manager: - self.player_manager = AvatarManager() - else: - self.player_manager = player_manager - self.mock_communicator = MockCommunicator() - - game_state = self.map_generator.get_game_state(self.player_manager) - worker_manager = ConcreteWorkerManager() - self.game_runner = GameRunner(worker_manager=worker_manager, - game_state=game_state, - communicator=self.mock_communicator) - self.turn_manager = ConcurrentTurnManager(game_state=self.game_runner.game_state, - end_turn_callback=lambda: None, - communicator=self.mock_communicator, - logs=self.logs, - have_avatars_code_updated={}) - random.seed(0) - - def run_single_turn(self): - self.game_runner.update() - self.turn_manager._run_single_turn() - - def get_logs(self, avatar_id): - return self.logs.get_user_logs(avatar_id) - - def get_avatar(self, avatar_id): - return self.game_runner.game_state.avatar_manager.get_avatar(avatar_id) - - def change_avatar_code(self, avatar_id, code): - avatar = (user for user in self.mock_communicator.data["main"]["users"] if user["id"] == avatar_id).next() - avatar["code"] = code diff --git a/aimmo-game/tests/test_simulation/test_avatar_location.py b/aimmo-game/tests/test_simulation/test_avatar_location.py deleted file mode 100644 index 68c7df746..000000000 --- a/aimmo-game/tests/test_simulation/test_avatar_location.py +++ /dev/null @@ -1,22 +0,0 @@ -import unittest -from .fake_game_runner import FakeGameRunner - - -class TestAvatarLocation(unittest.TestCase): - - def test_avatar_location_stays_same_after_code_change(self): - game_runner = FakeGameRunner() - new_code = "class Avatar(object):\n" \ - " def handle_turn(self, world_view, events):\n" \ - " from simulation.action import WaitAction\n" \ - " print(\"New Code\")\n" \ - " return WaitAction()\n" - - game_runner.run_single_turn() - avatar_location_before_code_change = game_runner.get_avatar(1).location - - game_runner.change_avatar_code(1, new_code) - game_runner.run_single_turn() - avatar_location_after_code_change = game_runner.get_avatar(1).location - - self.assertEqual(avatar_location_before_code_change, avatar_location_after_code_change) diff --git a/aimmo-game/tests/test_simulation/test_game_runner.py b/aimmo-game/tests/test_simulation/test_game_runner.py index 64665d62b..483df2ad6 100644 --- a/aimmo-game/tests/test_simulation/test_game_runner.py +++ b/aimmo-game/tests/test_simulation/test_game_runner.py @@ -41,20 +41,21 @@ def __call__(self, url, request): class TestGameRunner(TestCase): def setUp(self): - self.mock_communicator = MockCommunicator() game_state = GameState(InfiniteMap(), AvatarManager()) - self.game_runner = GameRunner(communicator=self.mock_communicator, - worker_manager=ConcreteWorkerManager(), - game_state=game_state) + self.game_runner = GameRunner(worker_manager=ConcreteWorkerManager(), + game_state=game_state, + end_turn_callback=lambda: None, + django_api_url='http://test') + self.game_runner.communicator = MockCommunicator() def test_correct_url(self): - self.mock_communicator.get_game_metadata = mock.MagicMock() + self.game_runner.communicator.get_game_metadata = mock.MagicMock() self.game_runner.update() # noinspection PyUnresolvedReferences - self.mock_communicator.get_game_metadata.assert_called_once() + self.game_runner.communicator.get_game_metadata.assert_called_once() def test_workers_and_avatars_added(self): - self.mock_communicator.data = RequestMock(3).value + self.game_runner.communicator.data = RequestMock(3).value self.game_runner.update() self.assertEqual(len(self.game_runner.worker_manager.final_workers), 3) for i in range(3): @@ -62,11 +63,12 @@ def test_workers_and_avatars_added(self): self.assertIn(i, self.game_runner.worker_manager.final_workers) self.assertEqual(self.game_runner.worker_manager.get_code(i), 'code for %s' % i) + # TODO: Is this still a game runner test? def test_changed_code(self): - self.mock_communicator.data = RequestMock(4).value + self.game_runner.communicator.data = RequestMock(4).value self.game_runner.update() - self.mock_communicator.change_code(0, 'changed 0') - self.mock_communicator.change_code(2, 'changed 2') + self.game_runner.communicator.change_code(0, 'changed 0') + self.game_runner.communicator.change_code(2, 'changed 2') self.game_runner.update() for i in range(4): @@ -81,9 +83,9 @@ def test_changed_code(self): self.assertEqual(self.game_runner.worker_manager.get_code(i), 'changed %s' % i) def test_remove_avatars(self): - self.mock_communicator.data = RequestMock(3).value + self.game_runner.communicator.data = RequestMock(3).value self.game_runner.update() - del self.mock_communicator.data['main']['users'][1] + del self.game_runner.communicator.data['main']['users'][1] self.game_runner.update() for i in range(3): diff --git a/aimmo-game/tests/test_simulation/test_game_state.py b/aimmo-game/tests/test_simulation/test_game_state.py index bcc42e9d5..4b63fb759 100644 --- a/aimmo-game/tests/test_simulation/test_game_state.py +++ b/aimmo-game/tests/test_simulation/test_game_state.py @@ -53,7 +53,7 @@ def game_state_with_two_avatars(self, world_map=None, avatar_manager=None): def test_add_avatar(self): state = GameState(AvatarMap(None), DummyAvatarManager()) - state.add_avatar(7, "") + state.add_avatar(7) self.assertIn(7, state.avatar_manager.avatars_by_id) avatar = state.avatar_manager.avatars_by_id[7] self.assertEqual(avatar.location.x, 10) @@ -68,12 +68,12 @@ def test_updates_map(self): def test_updates_map_with_correct_num_avatars(self): map = InfiniteMap() manager = DummyAvatarManager() - manager.add_avatar(1, '', None) + manager.add_avatar(1) state = GameState(map, manager) state.update_environment() self.assertEqual(map.num_avatars, 1) - manager.add_avatar(2, '', None) - manager.add_avatar(3, '', None) + manager.add_avatar(2) + manager.add_avatar(3) state.update_environment() self.assertEqual(map.num_avatars, 3) diff --git a/aimmo-game/tests/test_simulation/test_map_generator.py b/aimmo-game/tests/test_simulation/test_map_generator.py index fdc68c1ff..636f6c17e 100644 --- a/aimmo-game/tests/test_simulation/test_map_generator.py +++ b/aimmo-game/tests/test_simulation/test_map_generator.py @@ -135,13 +135,13 @@ def test_incomplete_without_avatars(self): def test_incomplete_at_score_0(self): game_state = self.get_game_state() - game_state.avatar_manager.add_avatar(1, '', None) + game_state.avatar_manager.add_avatar(1) game_state.main_avatar_id = 1 self.assertFalse(game_state.is_complete()) def test_completes_at_score_1(self): game_state = self.get_game_state() - game_state.avatar_manager.add_avatar(1, '', None) + game_state.avatar_manager.add_avatar(1) game_state.avatar_manager.avatars_by_id[1].score = 1 game_state.main_avatar_id = 1 self.assertTrue(game_state.is_complete()) @@ -149,5 +149,5 @@ def test_completes_at_score_1(self): def test_static_spawn(self): game_state = self.get_game_state() for i in range(5): - game_state.add_avatar(i, '') + game_state.add_avatar(i) self.assertEqual(game_state.avatar_manager.avatars_by_id[i].location, Location(-2, 0)) diff --git a/aimmo-game/tests/test_simulation/test_turn_manager.py b/aimmo-game/tests/test_simulation/test_turn_manager.py index 0e187e707..49680ebbc 100644 --- a/aimmo-game/tests/test_simulation/test_turn_manager.py +++ b/aimmo-game/tests/test_simulation/test_turn_manager.py @@ -5,7 +5,7 @@ from simulation.avatar.avatar_appearance import AvatarAppearance from simulation.game_state import GameState from simulation.location import Location -from simulation.turn_manager import ConcurrentTurnManager +from simulation.simulation_runner import ConcurrentSimulationRunner from .dummy_avatar import (DummyAvatarManager, MoveEastDummy, MoveNorthDummy, MoveSouthDummy, MoveWestDummy, WaitDummy, DeadDummy) @@ -39,16 +39,14 @@ class TestTurnManager(unittest.TestCase): def construct_default_avatar_appearance(self): return AvatarAppearance("#000", "#ddd", "#777", "#fff") - def construct_turn_manager(self, avatars, locations): + def construct_simulation_runner(self, avatars, locations): self.avatar_manager = DummyAvatarManager(avatars) + self.avatar_manager.avatars_by_id = dict(enumerate(avatars)) self.game_state = MockGameState(InfiniteMap(), self.avatar_manager) - self.turn_manager = ConcurrentTurnManager(game_state=self.game_state, - end_turn_callback=lambda: None, - communicator=MockCommunicator(), - have_avatars_code_updated={}) + self.simulation_runner = ConcurrentSimulationRunner(game_state=self.game_state, + communicator=MockCommunicator()) for index, location in enumerate(locations): - self.game_state.add_avatar(index, "", location) - return self.turn_manager + self.game_state.add_avatar(index, location) def assert_at(self, avatar, location): self.assertEqual(avatar.location, location) @@ -59,7 +57,7 @@ def get_avatar(self, player_id): return self.avatar_manager.get_avatar(player_id) def run_turn(self): - self.turn_manager.run_turn() + self.simulation_runner.run_turn(self.avatar_manager.avatars_by_id) def test_run_turn(self): """ @@ -67,7 +65,7 @@ def test_run_turn(self): (1) Expect: _ o """ - self.construct_turn_manager([MoveEastDummy], [ORIGIN]) + self.construct_simulation_runner([MoveEastDummy], [ORIGIN]) avatar = self.get_avatar(0) self.assert_at(avatar, ORIGIN) @@ -80,7 +78,7 @@ def test_run_several_turns(self): (5) Expect: _ _ _ _ _ o """ - self.construct_turn_manager([MoveEastDummy], [ORIGIN]) + self.construct_simulation_runner([MoveEastDummy], [ORIGIN]) avatar = self.get_avatar(0) self.assertEqual(avatar.location, ORIGIN) @@ -95,7 +93,7 @@ def test_run_several_turns_and_avatars(self): Expect: _ _ _ _ _ o _ _ _ _ _ o """ - self.construct_turn_manager([MoveEastDummy, MoveEastDummy], + self.construct_simulation_runner([MoveEastDummy, MoveEastDummy], [ORIGIN, ABOVE_ORIGIN]) avatar0 = self.get_avatar(0) avatar1 = self.get_avatar(1) @@ -112,7 +110,7 @@ def test_move_chain_succeeds(self): Expect: _ o o o o o """ - self.construct_turn_manager([MoveEastDummy for _ in range(5)], + self.construct_simulation_runner([MoveEastDummy for _ in range(5)], [Location(x, 0) for x in range(5)]) avatars = [self.get_avatar(i) for i in range(5)] @@ -126,7 +124,7 @@ def test_move_chain_fails_occupied(self): Expect: x x x _ """ - self.construct_turn_manager([MoveEastDummy, MoveEastDummy, WaitDummy], + self.construct_simulation_runner([MoveEastDummy, MoveEastDummy, WaitDummy], [Location(x, 0) for x in range(3)]) avatars = [self.get_avatar(i) for i in range(3)] @@ -141,7 +139,7 @@ def test_move_chain_fails_occupied_by_dead_avatar(self): Expect: x x ! _ """ - self.construct_turn_manager([MoveEastDummy, MoveEastDummy, DeadDummy], [Location(x, 0) for x in range(3)]) + self.construct_simulation_runner([MoveEastDummy, MoveEastDummy, DeadDummy], [Location(x, 0) for x in range(3)]) avatars = [self.get_avatar(i) for i in range(3)] [self.assert_at(avatars[x], Location(x, 0)) for x in range(3)] @@ -154,7 +152,7 @@ def test_move_fails_collision(self): Expect: x _ x """ - self.construct_turn_manager([MoveEastDummy, MoveWestDummy], [Location(0, 0), Location(2, 0)]) + self.construct_simulation_runner([MoveEastDummy, MoveWestDummy], [Location(0, 0), Location(2, 0)]) avatars = [self.get_avatar(i) for i in range(2)] self.assert_at(avatars[0], Location(0, 0)) @@ -172,7 +170,7 @@ def test_move_chain_fails_collision(self): Expect: x x x _ x """ locations = [Location(0, 0), Location(1, 0), Location(2, 0), Location(4, 0)] - self.construct_turn_manager( + self.construct_simulation_runner( [MoveEastDummy, MoveEastDummy, MoveEastDummy, MoveWestDummy], locations) avatars = [self.get_avatar(i) for i in range(4)] @@ -190,7 +188,7 @@ def test_move_chain_fails_cycle(self): x x """ locations = [Location(0, 1), Location(1, 1), Location(1, 0), Location(0, 0)] - self.construct_turn_manager( + self.construct_simulation_runner( [MoveEastDummy, MoveSouthDummy, MoveWestDummy, MoveNorthDummy], locations) avatars = [self.get_avatar(i) for i in range(4)] @@ -212,7 +210,7 @@ def test_move_chain_fails_spiral(self): Location(2, 1), Location(2, 0), Location(1, 0)] - self.construct_turn_manager( + self.construct_simulation_runner( [MoveEastDummy, MoveEastDummy, MoveSouthDummy, MoveWestDummy, MoveNorthDummy], locations) avatars = [self.get_avatar(i) for i in range(5)] diff --git a/aimmo-game/tests/test_socketio.py b/aimmo-game/tests/test_socketio.py index 371e102ec..ef8ba367f 100644 --- a/aimmo-game/tests/test_socketio.py +++ b/aimmo-game/tests/test_socketio.py @@ -5,6 +5,7 @@ import service from simulation.logs import Logs +from simulation.worker_managers.worker_manager import WorkerManager class MockGameState(): @@ -36,10 +37,8 @@ def setUp(self): @mock.patch('service.flask_app') def create_game_api(self, flask_app): - return service.GameAPI(game_state=MockGameState(), - worker_manager=None, - logs=self.mocked_logs, - have_avatars_code_updated=self.have_avatars_code_updated) + return service.GameAPI(worker_manager=WorkerManager(), + game_state=MockGameState()) @mock.patch('service.flask_app') @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) From 5bf599b5598f6675be0c4c8e0d82a56e6f527b8a Mon Sep 17 00:00:00 2001 From: Olaf Szmidt Date: Fri, 24 Aug 2018 11:13:55 +0100 Subject: [PATCH 3/5] SocketIO tests fixed --- aimmo-game/service.py | 2 -- aimmo-game/tests/test_socketio.py | 19 +++++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/aimmo-game/service.py b/aimmo-game/service.py index 319b0b6fa..2df142aea 100644 --- a/aimmo-game/service.py +++ b/aimmo-game/service.py @@ -60,8 +60,6 @@ def player_data(player_id): def register_world_update_on_connect(self): @socketio_server.on('connect') def world_update_on_connect(sid, environ): - self._sid_to_avatar_id[sid] = None - query = environ['QUERY_STRING'] self._find_avatar_id_from_query(sid, query) self.send_updates() diff --git a/aimmo-game/tests/test_socketio.py b/aimmo-game/tests/test_socketio.py index ef8ba367f..f07306ec7 100644 --- a/aimmo-game/tests/test_socketio.py +++ b/aimmo-game/tests/test_socketio.py @@ -5,8 +5,8 @@ import service from simulation.logs import Logs -from simulation.worker_managers.worker_manager import WorkerManager - +from simulation.worker_managers.local_worker_manager import LocalWorkerManager +from simulation.game_runner import GameRunner class MockGameState(): def serialise(self): @@ -37,13 +37,15 @@ def setUp(self): @mock.patch('service.flask_app') def create_game_api(self, flask_app): - return service.GameAPI(worker_manager=WorkerManager(), + return service.GameAPI(worker_manager=LocalWorkerManager(), game_state=MockGameState()) @mock.patch('service.flask_app') @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_socketio_emit_called(self, mocked_socketio, flask_app): + self.game_api.worker_manager.add_new_worker(1) self.game_api.register_world_update_on_connect()(self.sid, self.environ) + self.assertTrue(mocked_socketio.return_value.emit.assert_called_once) @mock.patch('service.flask_app') @@ -51,6 +53,7 @@ def test_socketio_emit_called(self, mocked_socketio, flask_app): def test_matched_session_id_to_avatar_id_mapping(self, mocked_socketio, flask_app): self.assertEqual(len(self.mocked_mappings), 0) + self.game_api.worker_manager.add_new_worker(1) self.game_api.register_world_update_on_connect()(self.sid, self.environ) self.assertEqual(len(self.mocked_mappings), 1) @@ -64,6 +67,7 @@ def test_no_match_session_id_to_avatar_id_mapping(self, mocked_socketio, flask_a self.assertEqual(len(self.mocked_mappings), 0) + self.game_api.worker_manager.add_new_worker(1) self.game_api.register_world_update_on_connect()(self.sid, self.environ) self.assertEqual(len(self.mocked_mappings), 1) @@ -75,6 +79,7 @@ def test_no_match_session_id_to_avatar_id_mapping(self, mocked_socketio, flask_a def test_send_updates_for_one_user(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], 'Logs one') + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) self.game_api.send_updates() @@ -88,6 +93,7 @@ def test_send_updates_for_one_user(self, mocked_socketio, flask_app): def test_no_logs_not_emitted(self, mocked_socketio, flask_app): """ If there are no logs for an avatar, no logs should be emitted. """ self.mocked_mappings[self.sid] = 1 + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid) @@ -97,9 +103,9 @@ def test_no_logs_not_emitted(self, mocked_socketio, flask_app): def test_empty_logs_not_emitted(self, mocked_socketio, flask_app): """ If the logs are an empty sting, no logs should be emitted. """ self.mocked_mappings[self.sid] = 1 - self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = False self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], '') + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid) @@ -113,6 +119,9 @@ def test_send_updates_for_multiple_users(self, mocked_socketio, flask_app): self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], 'Logs one') self.mocked_logs.set_user_logs(self.mocked_mappings['differentsid'], 'Logs two') + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + self.game_api.worker_manager.add_new_worker(self.mocked_mappings['differentsid']) + self.game_api.send_updates() user_one_game_state_call = mock.call('game-state', {'foo': 'bar'}, room=self.sid) @@ -130,6 +139,7 @@ def test_send_updates_for_multiple_users(self, mocked_socketio, flask_app): def test_send_code_changed_flag(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = True + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) self.game_api.send_updates() user_game_state_call = mock.call('game-state', {'foo': 'bar'}, room=self.sid) @@ -142,6 +152,7 @@ def test_send_code_changed_flag(self, mocked_socketio, flask_app): def test_send_false_flag_not_sent(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = False + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid) From 495b270c1a56ef0fc034098ac7bee143f58a5541 Mon Sep 17 00:00:00 2001 From: Olaf Szmidt Date: Tue, 28 Aug 2018 13:24:31 +0100 Subject: [PATCH 4/5] Fix further tests --- aimmo-game/service.py | 3 + aimmo-game/simulation/game_runner.py | 6 +- aimmo-game/simulation/simulation_runner.py | 2 +- aimmo-game/tests/functional/mock_world.py | 16 ++--- .../test_damage_pickups_and_effects.py | 12 ++-- .../tests/functional/test_effect_expiry.py | 46 +++++++++---- .../test_health_pickups_and_effects.py | 10 +-- ...est_invulnerability_pickups_and_effects.py | 8 +-- .../tests/functional/test_movements_in_map.py | 68 +++++-------------- .../avatar/test_avatar_wrapper.py | 6 -- .../tests/test_simulation/dummy_avatar.py | 6 ++ ...n_manager.py => test_simulation_runner.py} | 2 +- aimmo-game/tests/test_socketio.py | 31 +++++---- 13 files changed, 101 insertions(+), 115 deletions(-) rename aimmo-game/tests/test_simulation/{test_turn_manager.py => test_simulation_runner.py} (99%) diff --git a/aimmo-game/service.py b/aimmo-game/service.py index 2df142aea..11e1f2653 100644 --- a/aimmo-game/service.py +++ b/aimmo-game/service.py @@ -98,9 +98,12 @@ def _find_avatar_id_from_query(self, session_id, query_string): LOGGER.error("Avatar ID could not be casted into an integer") except KeyError: LOGGER.error("No avatar ID found. User may not be authorised ") + LOGGER.error("query_string: " + query_string) def _send_logs(self, player_id_to_workers): def should_send_logs(logs): + LOGGER.info("should_send_logs: " + str(logs)) + return logs is not None and logs != '' for sid, player_id in self._sid_to_avatar_id.iteritems(): diff --git a/aimmo-game/simulation/game_runner.py b/aimmo-game/simulation/game_runner.py index 8027e84a5..a5d5e5b03 100644 --- a/aimmo-game/simulation/game_runner.py +++ b/aimmo-game/simulation/game_runner.py @@ -62,9 +62,9 @@ def update_simulation(self, player_id_to_serialised_actions): self.end_turn_callback() def update(self): - self.update_workers() - self.update_simulation(self.worker_manager.get_player_id_to_serialised_actions()) - self.worker_manager.clear_logs() + self.update_workers() + self.update_simulation(self.worker_manager.get_player_id_to_serialised_actions()) + self.worker_manager.clear_logs() def run(self): while True: diff --git a/aimmo-game/simulation/simulation_runner.py b/aimmo-game/simulation/simulation_runner.py index 64e92ed21..a92def393 100644 --- a/aimmo-game/simulation/simulation_runner.py +++ b/aimmo-game/simulation/simulation_runner.py @@ -60,7 +60,7 @@ def run_turn(self, player_id_to_serialised_actions): avatars = self.game_state.avatar_manager.active_avatars for avatar in avatars: - self._run_turn_for_avatar(avatar, player_id_to_serialised_actions[avatar.id]) + self._run_turn_for_avatar(avatar, player_id_to_serialised_actions[avatar.player_id]) location_to_clear = avatar.action.target_location avatar.action.process(self.game_state.world_map) self.game_state.world_map.clear_cell_actions(location_to_clear) diff --git a/aimmo-game/tests/functional/mock_world.py b/aimmo-game/tests/functional/mock_world.py index 5d6afa237..1c1e3da11 100644 --- a/aimmo-game/tests/functional/mock_world.py +++ b/aimmo-game/tests/functional/mock_world.py @@ -1,8 +1,7 @@ import random from simulation import map_generator -from simulation.turn_manager import SequentialTurnManager -from simulation.logs import Logs +from simulation.simulation_runner import SequentialSimulationRunner from tests.test_simulation.mock_communicator import MockCommunicator from tests.test_simulation.dummy_avatar import DummyAvatarManager, MoveEastDummy @@ -21,19 +20,14 @@ class MockWorld(object): By default, the first avatar added to the world will be a MoveEastDummy. """ - def __init__(self, settings=SETTINGS, dummies_list=None, map_generator_class=map_generator.Main, logs=None): + def __init__(self, settings=SETTINGS, dummies_list=None, map_generator_class=map_generator.Main, + simulation_runner_class=SequentialSimulationRunner): random.seed(0) if dummies_list is None: dummies_list = [MoveEastDummy] - if logs is None: - logs = Logs() - self.generator = map_generator_class(settings) self.avatar_manager = DummyAvatarManager(dummies_list) self.game_state = self.generator.get_game_state(self.avatar_manager) - self.turn_manager = SequentialTurnManager(game_state=self.game_state, - end_turn_callback=lambda: None, - communicator=MockCommunicator(), - logs=logs, - have_avatars_code_updated={}) + self.simulation_runner = simulation_runner_class(game_state=self.game_state, + communicator=MockCommunicator()) diff --git a/aimmo-game/tests/functional/test_damage_pickups_and_effects.py b/aimmo-game/tests/functional/test_damage_pickups_and_effects.py index 27468a298..601643481 100644 --- a/aimmo-game/tests/functional/test_damage_pickups_and_effects.py +++ b/aimmo-game/tests/functional/test_damage_pickups_and_effects.py @@ -15,7 +15,7 @@ def setUp(self): avatar manager, game state, turn manager and a map generator. """ self.game = MockWorld() - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) _avatar_spawn_cell = self.game.game_state.world_map.get_cell(Location(0, 0)) self.initial_attack_strength = _avatar_spawn_cell.avatar.attack_strength self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) @@ -24,7 +24,7 @@ def test_damage_boost_pickup_can_be_picked_up_default(self): pickup_created = DamageBoostPickup(self.cell) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(len(self.game.avatar_manager.get_avatar(1).effects), 1) @@ -37,7 +37,7 @@ def test_damage_boost_pickup_can_be_picked_up_custom_integer(self, boost_value): pickup_created = DamageBoostPickup(self.cell, boost_value) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(len(self.game.avatar_manager.get_avatar(1).effects), 1) @@ -51,7 +51,7 @@ def test_damage_boost_pickup_can_be_picked_up_custom_floats(self, boost_value): pickup_created = DamageBoostPickup(self.cell, boost_value) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(len(self.game.avatar_manager.get_avatar(1).effects), 1) @@ -65,7 +65,7 @@ def test_damage_boost_increases_attack_strength_with_default_integer(self): pickup_created = DamageBoostPickup(self.cell) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(self.cell.avatar.attack_strength, self.initial_attack_strength + DAMAGE_BOOST_DEFAULT) @@ -78,6 +78,6 @@ def test_damage_boost_increases_attack_strength_with_custom_integers(self, boost pickup_created = DamageBoostPickup(self.cell, boost_value) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(self.cell.avatar.attack_strength, self.initial_attack_strength + boost_value) diff --git a/aimmo-game/tests/functional/test_effect_expiry.py b/aimmo-game/tests/functional/test_effect_expiry.py index 5fa095723..9c9ecd314 100644 --- a/aimmo-game/tests/functional/test_effect_expiry.py +++ b/aimmo-game/tests/functional/test_effect_expiry.py @@ -25,7 +25,7 @@ def setUp(self): } self.game = MockWorld(SETTINGS) - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) self.avatar = self.game.avatar_manager.get_avatar(1) self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) @@ -40,7 +40,9 @@ def test_single_damage_boost_pickup_expiry(self): # Avatar moves EAST to (1,0) where pickup is located, then repeats it 5 times. for i in range(6): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created.EFFECT)) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 5) @@ -48,7 +50,9 @@ def test_single_damage_boost_pickup_expiry(self): # Run 5 more turns and expect the effect to expire. for i in range(5): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.attack_strength, 1) @@ -64,7 +68,7 @@ def test_single_invulnerability_pickup_pickup_expiry(self): # Avatar moves EAST to (1,0) where pickup is located, then repeats it 5 times. for i in range(6): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created.EFFECT)) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 5) @@ -72,7 +76,7 @@ def test_single_invulnerability_pickup_pickup_expiry(self): # Run 5 more turns and expect the effect to expire. for i in range(5): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.resistance, 0) @@ -93,7 +97,9 @@ def test_multiple_damage_boost_pickup_expiry(self): self.assertEqual(self.avatar.attack_strength, 1) # Avatar moves EAST to (1,0) where pickup one is located. - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created_one.EFFECT)) self.assertEqual(len(self.avatar.effects), 1) @@ -102,7 +108,9 @@ def test_multiple_damage_boost_pickup_expiry(self): # Move twice to the second pickup. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[1], pickup_created_two.EFFECT)) self.assertEqual(len(self.avatar.effects), 2) @@ -110,7 +118,9 @@ def test_multiple_damage_boost_pickup_expiry(self): # Eight turns later, we expect the first effect to expire. for i in range(8): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 1) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 2) @@ -118,7 +128,9 @@ def test_multiple_damage_boost_pickup_expiry(self): # Two turns later, the second pickup expires too. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.attack_strength, 1) @@ -139,7 +151,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): self.assertEqual(self.avatar.resistance, 0) # Avatar moves EAST to (1,0) where pickup one is located. - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created_one.EFFECT)) self.assertEqual(len(self.avatar.effects), 1) @@ -148,7 +162,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): # Move twice to the second pickup. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[1], pickup_created_two.EFFECT)) self.assertEqual(len(self.avatar.effects), 2) @@ -156,7 +172,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): # Eight turns later, we expect the first effect to expire. for i in range(8): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 1) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 2) @@ -164,7 +182,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): # Two turns later, the second pickup expires too. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.resistance, 0) diff --git a/aimmo-game/tests/functional/test_health_pickups_and_effects.py b/aimmo-game/tests/functional/test_health_pickups_and_effects.py index 5f745c678..76ccdc66e 100644 --- a/aimmo-game/tests/functional/test_health_pickups_and_effects.py +++ b/aimmo-game/tests/functional/test_health_pickups_and_effects.py @@ -19,7 +19,7 @@ def setUp(self): avatar manager, game state, turn manager and a map generator. """ self.game = MockWorld() - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) self.initial_health = self.game.avatar_manager.get_avatar(1).health @@ -29,7 +29,7 @@ def test_health_pickups_and_effects_apply_default(self): """ self.cell.pickup = HealthPickup(self.cell) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.health, self.initial_health + @@ -43,7 +43,7 @@ def test_health_pickups_and_effects_apply_custom_integers(self, restore_value): self.setUp() self.cell.pickup = HealthPickup(self.cell, restore_value) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) if self.initial_health + restore_value > HEALTH_RESTORE_MAX: @@ -61,7 +61,7 @@ def test_health_pickups_and_effects_apply_custom_floats(self, restore_value): self.setUp() self.cell.pickup = HealthPickup(self.cell, restore_value) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) if self.initial_health + restore_value > HEALTH_RESTORE_MAX: @@ -81,7 +81,7 @@ def test_health_effect_is_capped_at_HEALTH_RESTORE_MAX(self, restore_value): self.setUp() self.cell.pickup = HealthPickup(self.cell, restore_value) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.health, AVATAR_HEALTH_MAX) diff --git a/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py b/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py index 92f9a42c2..32747dfe2 100644 --- a/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py +++ b/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py @@ -13,7 +13,7 @@ def setUp(self): avatar manager, game state, turn manager and a map generator. """ self.game = MockWorld() - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) def test_invulnerability_pickups_increase_resistance_of_avatar(self): @@ -25,7 +25,7 @@ def test_invulnerability_pickups_increase_resistance_of_avatar(self): self.cell.pickup = InvulnerabilityPickup(self.cell) self.assertEqual(self.game.avatar_manager.get_avatar(1).resistance, 0) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.resistance, 1000) @@ -37,13 +37,13 @@ def test_invulnerability_pickups_can_increase_resistance_to_2000(self): then picks up the pickup, and moves to 2,0 to do the same. """ self.cell.pickup = InvulnerabilityPickup(self.cell) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.resistance, 1000) self.cell = self.game.game_state.world_map.get_cell(Location(2, 0)) self.cell.pickup = InvulnerabilityPickup(self.cell) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar.resistance, 2000) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) diff --git a/aimmo-game/tests/functional/test_movements_in_map.py b/aimmo-game/tests/functional/test_movements_in_map.py index 0745bc1ce..43f9eed9b 100644 --- a/aimmo-game/tests/functional/test_movements_in_map.py +++ b/aimmo-game/tests/functional/test_movements_in_map.py @@ -3,6 +3,7 @@ from mock_world import MockWorld from simulation.location import Location from simulation import map_generator +from simulation.simulation_runner import ConcurrentSimulationRunner from tests.test_simulation.dummy_avatar import ( MoveEastDummy, MoveWestDummy, MoveNorthDummy, MoveSouthDummy, WaitDummy, DeadDummy ) @@ -22,8 +23,8 @@ def set_up_environment(self, dummy_list=None, location=Location(0, 0), Utility method for testing. """ self.game = MockWorld(TestMovementsInMap.SETTINGS, dummy_list, - map_generator_class) - self.game.game_state.add_avatar(1, None, location) + map_generator_class, ConcurrentSimulationRunner) + self.game.game_state.add_avatar(player_id=1, location=location) self.avatar = self.game.avatar_manager.get_avatar(1) def set_up_and_make_movements_in_a_single_direction(self, dummy_list, @@ -36,7 +37,7 @@ def set_up_and_make_movements_in_a_single_direction(self, dummy_list, self.assertEqual(self.avatar.location, spawn) for i in range(number_of_movements): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) def test_movement_five_times_in_all_directions(self): """ @@ -105,7 +106,7 @@ def test_avatar_cannot_move_into_obstacle(self): self.assertTrue(self.avatar.location, Location(0, 0)) for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(self.avatar.location, Location(1, 0)) @@ -115,14 +116,16 @@ def test_avatars_cannot_go_into_each_other(self): """ # Even number of cells between two avatars. self.set_up_environment([MoveEastDummy, MoveWestDummy]) - self.game.game_state.add_avatar(2, None, Location(3, 0)) + self.game.game_state.add_avatar(2, Location(3, 0)) avatar_two = self.game.avatar_manager.get_avatar(2) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(3, 0)) for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) # Avatar 1 & Avatar 2 only managed to move once. self.assertEqual(self.avatar.location, Location(1, 0)) @@ -130,68 +133,33 @@ def test_avatars_cannot_go_into_each_other(self): # Odd number of cells between two avatars. self.set_up_environment([MoveEastDummy, MoveWestDummy]) - self.game.game_state.add_avatar(2, None, Location(4, 0)) + self.game.game_state.add_avatar(2, Location(4, 0)) avatar_two = self.game.avatar_manager.get_avatar(2) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(4, 0)) for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) - # Avatar 1 managed to move twice, while Avatar 2 managed to only move once. - self.assertEqual(self.avatar.location, Location(2, 0)) + # Avatar 1 & Avatar 2 managed to only move only once. + self.assertEqual(self.avatar.location, Location(1, 0)) self.assertEqual(avatar_two.location, Location(3, 0)) # Live avatar can't move into a square occupied by a 'dead' (no worker) avatar self.set_up_environment([DeadDummy, MoveWestDummy]) - self.game.game_state.add_avatar(2, None, Location(1, 0)) + self.game.game_state.add_avatar(2, Location(1, 0)) avatar_two = self.game.avatar_manager.get_avatar(2) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(1, 0)) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(1, 0)) - def test_sequential_avatars_tailing_each_other(self): - """ - Two avatars placed beside each other horizontally. They want to move east, but - SequentialTurnManager gives priority to ID1. It gets blocked by ID2 so only two - moves. - """ - self.set_up_environment([MoveEastDummy, MoveEastDummy]) - self.game.game_state.add_avatar(2, None, Location(1, 0)) - avatar_two = self.game.avatar_manager.get_avatar(2) - - self.assertEqual(self.avatar.location, Location(0, 0)) - self.assertEqual(avatar_two.location, Location(1, 0)) - - for i in range(1): - self.game.turn_manager._run_single_turn() - - self.assertEqual(self.avatar.location, Location(0, 0)) - self.assertEqual(avatar_two.location, Location(2, 0)) - - def test_level_one_appropriate_behaviour(self): - """ - Tests the appropriate behaviour of Level 1. The test should reflect everything - that is written in the manual - test plan. - """ - self.set_up_environment(dummy_list=[MoveEastDummy], location=Location(-2, 0), - map_generator_class=map_generator.Level1) - score_cell = self.game.game_state.world_map.get_cell(Location(2, 0)) - self.assertTrue(score_cell.generates_score) - self.game.game_state.main_avatar_id = 1 - - for i in range(5): - self.game.turn_manager._run_single_turn() - - self.assertEqual(self.avatar.location, Location(2, 0)) - self.assertTrue(self.game.generator.check_complete(self.game.game_state)) - def test_wait_action_on_a_single_avatar(self): """ Ensures a returned WaitAction will keep the avatar in its initial location. @@ -200,6 +168,6 @@ def test_wait_action_on_a_single_avatar(self): self.assertEqual(self.avatar.location, Location(0, 0)) for i in range(5): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.avatar.location, Location(0, 0)) diff --git a/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py b/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py index ad3ef7583..06f8a538f 100644 --- a/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py +++ b/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py @@ -72,12 +72,6 @@ def take_turn(self, request_mock=None): worker_data = self.worker.fetch_data(None) self.avatar.decide_action(worker_data) - def test_action_has_created_correctly(self): - self.take_turn() - self.assertGreater(len(actions_created), 0, 'No action applied') - self.assertEqual(len(actions_created), 1, 'Too many actions applied') - self.assertEqual(actions_created[0].avatar, self.avatar, 'Action applied on wrong avatar') - def test_bad_action_data_given(self): request_mock = InvalidJSONRequest self.take_turn(request_mock) diff --git a/aimmo-game/tests/test_simulation/dummy_avatar.py b/aimmo-game/tests/test_simulation/dummy_avatar.py index b11f0a18b..e6f4b7b67 100644 --- a/aimmo-game/tests/test_simulation/dummy_avatar.py +++ b/aimmo-game/tests/test_simulation/dummy_avatar.py @@ -127,3 +127,9 @@ def add_avatar(self, player_id, location=(0, 0)): def add_avatar_directly(self, avatar): self.avatars_by_id[avatar.player_id] = avatar + + def get_player_id_to_serialised_action(self): + for dummy in self.avatars_by_id.values(): + dummy.decide_action(None) + + return {player_id: self.avatars_by_id[player_id]._action for player_id in self.avatars_by_id} diff --git a/aimmo-game/tests/test_simulation/test_turn_manager.py b/aimmo-game/tests/test_simulation/test_simulation_runner.py similarity index 99% rename from aimmo-game/tests/test_simulation/test_turn_manager.py rename to aimmo-game/tests/test_simulation/test_simulation_runner.py index 49680ebbc..b2ef223e8 100644 --- a/aimmo-game/tests/test_simulation/test_turn_manager.py +++ b/aimmo-game/tests/test_simulation/test_simulation_runner.py @@ -26,7 +26,7 @@ def get_state_for(self, avatar): return self -class TestTurnManager(unittest.TestCase): +class TestSimulationRunner(unittest.TestCase): """ Key: > : Avatar moving eastward diff --git a/aimmo-game/tests/test_socketio.py b/aimmo-game/tests/test_socketio.py index f07306ec7..cfd7fd34e 100644 --- a/aimmo-game/tests/test_socketio.py +++ b/aimmo-game/tests/test_socketio.py @@ -6,7 +6,7 @@ import service from simulation.logs import Logs from simulation.worker_managers.local_worker_manager import LocalWorkerManager -from simulation.game_runner import GameRunner + class MockGameState(): def serialise(self): @@ -24,10 +24,7 @@ def wrapper(*args, **kwargs): class TestSocketio(TestCase): def setUp(self): - self.environ = {} - self.mocked_logs = Logs() - self.have_avatars_code_updated = {} - self.environ['QUERY_STRING'] = 'avatar_id=1&EIO=3&transport=polling&t=MJhoMgb' + self.environ = {'QUERY_STRING': 'avatar_id=1&EIO=3&transport=polling&t=MJhoMgb'} self.game_api = self.create_game_api() self.mocked_mappings = self.game_api._sid_to_avatar_id self.sid = ''.join(random.choice(string.ascii_uppercase + @@ -70,16 +67,16 @@ def test_no_match_session_id_to_avatar_id_mapping(self, mocked_socketio, flask_a self.game_api.worker_manager.add_new_worker(1) self.game_api.register_world_update_on_connect()(self.sid, self.environ) - self.assertEqual(len(self.mocked_mappings), 1) - self.assertTrue(self.sid in self.mocked_mappings) - self.assertIsNone(self.mocked_mappings[self.sid]) + self.assertEqual(len(self.mocked_mappings), 0) + self.assertFalse(self.sid in self.mocked_mappings) @mock.patch('service.flask_app') @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_send_updates_for_one_user(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 - self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], 'Logs one') self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.log = 'Logs one' self.game_api.send_updates() @@ -104,8 +101,9 @@ def test_empty_logs_not_emitted(self, mocked_socketio, flask_app): """ If the logs are an empty sting, no logs should be emitted. """ self.mocked_mappings[self.sid] = 1 - self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], '') self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.logs = '' self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid) @@ -116,11 +114,12 @@ def test_send_updates_for_multiple_users(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 self.mocked_mappings['differentsid'] = 2 - self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], 'Logs one') - self.mocked_logs.set_user_logs(self.mocked_mappings['differentsid'], 'Logs two') - self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) self.game_api.worker_manager.add_new_worker(self.mocked_mappings['differentsid']) + worker_one = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker_two = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings['differentsid']] + worker_one.log = 'Logs one' + worker_two.log = 'Logs two' self.game_api.send_updates() @@ -138,8 +137,9 @@ def test_send_updates_for_multiple_users(self, mocked_socketio, flask_app): @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_send_code_changed_flag(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 - self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = True self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.has_code_updated = True self.game_api.send_updates() user_game_state_call = mock.call('game-state', {'foo': 'bar'}, room=self.sid) @@ -151,8 +151,9 @@ def test_send_code_changed_flag(self, mocked_socketio, flask_app): @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_send_false_flag_not_sent(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 - self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = False self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.has_code_updated = False self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid) From a29288287882b0e475c329c0e0747d1c077a4616 Mon Sep 17 00:00:00 2001 From: Olaf Szmidt Date: Tue, 28 Aug 2018 13:44:23 +0100 Subject: [PATCH 5/5] Revert yarn.lock --- game_frontend/yarn.lock | 483 ++++++++++++++++++++-------------------- 1 file changed, 241 insertions(+), 242 deletions(-) diff --git a/game_frontend/yarn.lock b/game_frontend/yarn.lock index 80eef4d83..cdbadc543 100644 --- a/game_frontend/yarn.lock +++ b/game_frontend/yarn.lock @@ -3,18 +3,25 @@ "@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.2.tgz#12b6daeb408238360744649d16c0e9fa7ab3859e" + version "7.0.0-beta.55" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.55.tgz#71f530e7b010af5eb7a7df7752f78921dd57e9ee" dependencies: - "@babel/highlight" "7.0.0-rc.2" + "@babel/highlight" "7.0.0-beta.55" -"@babel/highlight@7.0.0-rc.2": - version "7.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.2.tgz#0af688a69e3709d9cf392e1837cda18c08d34d4f" +"@babel/highlight@7.0.0-beta.55": + version "7.0.0-beta.55" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.55.tgz#988653647d629c261dae156e74d5f0252ba520c0" dependencies: chalk "^2.0.0" esutils "^2.0.2" - js-tokens "^4.0.0" + js-tokens "^3.0.0" + +"@babel/runtime@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.42.tgz#352e40c92e0460d3e82f49bd7e79f6cda76f919f" + dependencies: + core-js "^2.5.3" + regenerator-runtime "^0.11.1" "@babel/runtime@7.0.0-beta.56": version "7.0.0-beta.56" @@ -22,17 +29,11 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@7.0.0-rc.1": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-rc.1.tgz#42f36fc5817911c89ea75da2b874054922967616" - dependencies: - regenerator-runtime "^0.12.0" - "@material-ui/core@^1.0.0": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-1.5.1.tgz#cb00cb934447ae688e08129f1dab55f54d29d87a" + version "1.4.3" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-1.4.3.tgz#e6bc29b441c07932cc64fffb02670792b119fb8e" dependencies: - "@babel/runtime" "7.0.0-rc.1" + "@babel/runtime" "7.0.0-beta.42" "@types/jss" "^9.5.3" "@types/react-transition-group" "^2.0.8" brcast "^3.0.1" @@ -61,17 +62,15 @@ warning "^4.0.1" "@material-ui/icons@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-2.0.3.tgz#d3da9d6e31b1adfbc48efe33c7cb75b32b784096" + version "2.0.1" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-2.0.1.tgz#1151cc66a3d41099de3ddaac33488e399d3425f0" dependencies: - "@babel/runtime" "7.0.0-rc.1" + "@babel/runtime" "7.0.0-beta.42" recompose "^0.28.0" "@material-ui/lab@^1.0.0-alpha.9": - version "1.0.0-alpha.11" - resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-1.0.0-alpha.11.tgz#b974a4ff8aaf66c20f25ba630f9d456d20d8dd80" - dependencies: - "@babel/runtime" "7.0.0-rc.1" + version "1.0.0-alpha.9" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-1.0.0-alpha.9.tgz#a76da06cce4d2c3eefcea567afb6970c18237969" "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -81,8 +80,8 @@ glob-to-regexp "^0.3.0" "@nodelib/fs.stat@^1.0.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.1.tgz#53f349bb986ab273d601175aa1b25a655ab90ee3" + version "1.1.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a" "@types/jss@^9.5.3": version "9.5.4" @@ -92,12 +91,12 @@ indefinite-observable "^1.0.1" "@types/node@*": - version "10.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.7.1.tgz#b704d7c259aa40ee052eec678758a68d07132a2e" + version "10.5.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.4.tgz#6eccc158504357d1da91434d75e86acde94bb10b" "@types/prop-types@*": - version "15.5.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3" + version "15.5.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.4.tgz#9e6199bad131786e24c2baa2a82705a02139fbf8" dependencies: "@types/react" "*" @@ -108,12 +107,16 @@ "@types/react" "*" "@types/react@*": - version "16.4.11" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.11.tgz#330f3d864300f71150dc2d125e48644c098f8770" + version "16.4.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.8.tgz#ff0440429783df0927bdcd430fa1225f7c08cf36" dependencies: "@types/prop-types" "*" csstype "^2.2.0" +abab@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -150,7 +153,7 @@ ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" -ajv@^5.2.3, ajv@^5.3.0: +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -280,14 +283,6 @@ array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" -array.prototype.flat@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.10.0" - function-bind "^1.1.1" - arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" @@ -309,10 +304,8 @@ asn1.js@^4.0.0: minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - dependencies: - safer-buffer "~2.1.0" + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" @@ -355,8 +348,8 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" autoprefixer@^6.3.1: version "6.7.7" @@ -373,9 +366,9 @@ aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -1261,12 +1254,12 @@ browserslist@^3.2.6: electron-to-chromium "^1.3.47" browserslist@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.0.tgz#81cbb8e52dfa09918f93c6e051d779cb7360785d" + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.0.1.tgz#61c05ce2a5843c7d96166408bc23d58b5416e818" dependencies: - caniuse-lite "^1.0.30000878" - electron-to-chromium "^1.3.61" - node-releases "^1.0.0-alpha.11" + caniuse-lite "^1.0.30000865" + electron-to-chromium "^1.3.52" + node-releases "^1.0.0-alpha.10" bser@^2.0.0: version "2.0.0" @@ -1279,8 +1272,8 @@ buffer-equal@0.0.1: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" buffer-xor@^1.0.3: version "1.0.3" @@ -1372,12 +1365,12 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000878" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000878.tgz#0d0c6d8500c3aea21441fad059bce4b8f3f509df" + version "1.0.30000872" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000872.tgz#3f6e53b63d373768bf99e896133d66ef89c49999" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000878: - version "1.0.30000878" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz#c644c39588dd42d3498e952234c372e5a40a4123" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000865: + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" capture-exit@^1.2.0: version "1.2.0" @@ -1456,9 +1449,9 @@ chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" -ci-info@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.4.0.tgz#4841d53cad49f11b827b648ebde27a6e189b412f" +ci-info@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1525,8 +1518,8 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" clone@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" clones@^1.1.0: version "1.1.0" @@ -1580,8 +1573,8 @@ color-string@^0.3.0: color-name "^1.0.0" color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.2.tgz#26e45814bc3c9a7cbd6751648a41434514a773a9" dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -1617,7 +1610,7 @@ colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" -combined-stream@1.0.6, combined-stream@~1.0.6: +combined-stream@1.0.6, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: @@ -1627,17 +1620,17 @@ command-exists@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.7.tgz#16828f0c3ff2b0c58805861ef211b64fc15692a8" -commander@^2.11.0, commander@^2.9.0: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - -commander@~2.16.0: +commander@^2.11.0, commander@^2.9.0, commander@~2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + compare-versions@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.1.tgz#1ede3172b713c15f7c7beb98cb74d2d82576dad3" + version "3.3.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" component-bind@1.0.0: version "1.0.0" @@ -1701,7 +1694,7 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.3: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" @@ -1710,8 +1703,8 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" cosmiconfig@^5.0.0: - version "5.0.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" + version "5.0.5" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0" dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" @@ -1956,8 +1949,8 @@ cssnano@^3.4.0: postcss-zindex "^2.0.1" cssnano@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.0.5.tgz#8789b5fdbe7be05d8a0f7e45c4c789ebe712f5aa" + version "4.0.4" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.0.4.tgz#8a397b5e307e06fd7e361bf11344b1cff8749a86" dependencies: cosmiconfig "^5.0.0" cssnano-preset-default "^4.0.0" @@ -1982,8 +1975,8 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" cssstyle@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" + version "1.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" dependencies: cssom "0.3.x" @@ -1998,12 +1991,12 @@ dashdash@^1.12.0: assert-plus "^1.0.0" data-urls@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.1.tgz#d416ac3896918f29ca84d81085bc3705834da579" + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.1.0" - whatwg-url "^7.0.0" + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" date-now@^0.1.4: version "0.1.4" @@ -2017,8 +2010,8 @@ deasync@^0.1.13: nan "^2.0.7" debounce@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" + version "1.1.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408" debug-log@^1.0.0: version "1.0.1" @@ -2069,10 +2062,11 @@ defaults@^1.0.3: clone "^1.0.2" define-properties@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" dependencies: - object-keys "^1.0.12" + foreach "^2.0.5" + object-keys "^1.0.8" define-property@^0.2.5: version "0.2.5" @@ -2276,13 +2270,13 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.61: - version "1.3.61" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.61.tgz#a8ac295b28d0f03d85e37326fd16b6b6b17a1795" +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.52: + version "1.3.52" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2333,25 +2327,23 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" enzyme-adapter-react-16@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.2.0.tgz#c6e80f334e0a817873262d7d01ee9e4747e3c97e" + version "1.1.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz#a8f4278b47e082fbca14f5bfb1ee50ee650717b4" dependencies: - enzyme-adapter-utils "^1.5.0" - function.prototype.name "^1.1.0" - object.assign "^4.1.0" + enzyme-adapter-utils "^1.3.0" + lodash "^4.17.4" + object.assign "^4.0.4" object.values "^1.0.4" - prop-types "^15.6.2" - react-is "^16.4.2" + prop-types "^15.6.0" react-reconciler "^0.7.0" react-test-renderer "^16.0.0-0" -enzyme-adapter-utils@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.5.0.tgz#a020ab3ae79bb1c85e1d51f48f35e995e0eed810" +enzyme-adapter-utils@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz#c403b81e8eb9953658569e539780964bdc98de62" dependencies: - function.prototype.name "^1.1.0" object.assign "^4.1.0" - prop-types "^15.6.2" + prop-types "^15.6.0" enzyme-to-json@^3.3.4: version "3.3.4" @@ -2360,20 +2352,19 @@ enzyme-to-json@^3.3.4: lodash "^4.17.4" enzyme@^3.3.0: - version "3.4.4" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.4.4.tgz#92c7c6b9e59d4ef0c3d36a75dccc0e41a5c14d21" + version "3.3.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.3.0.tgz#0971abd167f2d4bf3f5bd508229e1c4b6dc50479" dependencies: - array.prototype.flat "^1.2.1" cheerio "^1.0.0-rc.2" - function.prototype.name "^1.1.0" - has "^1.0.3" + function.prototype.name "^1.0.3" + has "^1.0.1" is-boolean-object "^1.0.0" - is-callable "^1.1.4" + is-callable "^1.1.3" is-number-object "^1.0.3" is-string "^1.0.4" is-subset "^0.1.1" lodash "^4.17.4" - object-inspect "^1.6.0" + object-inspect "^1.5.0" object-is "^1.0.1" object.assign "^4.1.0" object.entries "^1.0.4" @@ -2387,7 +2378,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: +es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -2468,8 +2459,8 @@ eslint-module-utils@^2.1.1, eslint-module-utils@^2.2.0: pkg-dir "^1.0.0" eslint-plugin-import@^2.8.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz#df24f241175e312d91662dc91ca84064caec14ed" dependencies: contains-path "^0.1.0" debug "^2.6.8" @@ -2515,10 +2506,9 @@ eslint-plugin-promise@~3.7.0: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz#f4bde5c2c77cdd69557a8f69a24d1ad3cfc9e67e" eslint-plugin-react@^7.6.1: - version "7.11.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + version "7.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz#af5c1fef31c4704db02098f9be18202993828b50" dependencies: - array-includes "^3.0.3" doctrine "^2.1.0" has "^1.0.3" jsx-ast-utils "^2.0.1" @@ -2761,7 +2751,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: +extend@~3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -2952,7 +2942,7 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~2.3.2: +form-data@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: @@ -2988,8 +2978,8 @@ fsevents@^1.2.2, fsevents@^1.2.3: node-pre-gyp "^0.10.0" fswatcher-child@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fswatcher-child/-/fswatcher-child-1.1.0.tgz#af1650590f897532431731247fd6270f333912ff" + version "1.0.5" + resolved "https://registry.yarnpkg.com/fswatcher-child/-/fswatcher-child-1.0.5.tgz#134d012ffa74918975617e00e56e4139f36cb140" dependencies: chokidar "^2.0.3" @@ -2997,7 +2987,7 @@ function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" -function.prototype.name@^1.1.0: +function.prototype.name@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327" dependencies: @@ -3131,11 +3121,11 @@ har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" -har-validator@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" dependencies: - ajv "^5.3.0" + ajv "^5.1.0" har-schema "^2.0.0" has-ansi@^2.0.0: @@ -3263,15 +3253,15 @@ html-encoding-sniffer@^1.0.2: whatwg-encoding "^1.0.1" htmlnano@^0.1.9: - version "0.1.10" - resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.1.10.tgz#a0a548eb4c76ae2cf2423ec7a25c881734d3dea6" + version "0.1.9" + resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.1.9.tgz#e6137aea84d20311a3875c42eb2799a1ff352627" dependencies: cssnano "^3.4.0" object-assign "^4.0.1" posthtml "^0.11.3" - posthtml-render "^1.1.4" + posthtml-render "^1.1.3" svgo "^1.0.5" - terser "^3.8.1" + uglify-es "^3.3.9" htmlparser2@^3.9.1, htmlparser2@^3.9.2: version "3.9.2" @@ -3309,15 +3299,13 @@ hyphenate-style-name@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b" -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: safer-buffer ">= 2.1.2 < 3" @@ -3456,15 +3444,15 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3, is-callable@^1.1.4: +is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.0.tgz#3f4a08d6303a09882cef3f0fb97439c5f5ce2d53" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" dependencies: - ci-info "^1.3.0" + ci-info "^1.0.0" is-color-stop@^1.0.0: version "1.1.0" @@ -4096,14 +4084,14 @@ js-beautify@^1.7.5: mkdirp "~0.5.0" nopt "~3.0.1" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - -js-tokens@^3.0.2: +js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + js-yaml@^3.10.0, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" @@ -4569,7 +4557,7 @@ mime-db@~1.35.0: version "1.35.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.17: version "2.1.19" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" dependencies: @@ -4610,8 +4598,8 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" minipass@^2.2.1, minipass@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -4672,8 +4660,8 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" nearley@^2.7.10: - version "2.15.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.15.1.tgz#965e4e6ec9ed6b80fc81453e161efbcebb36d247" + version "2.15.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.15.0.tgz#d1ff5406a58064615fe6eafb429cf06fbb1b7eab" dependencies: moo "^0.4.3" nomnom "~1.6.2" @@ -4682,8 +4670,8 @@ nearley@^2.7.10: semver "^5.4.1" needle@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -4701,8 +4689,8 @@ node-fetch@^1.0.1: is-stream "^1.0.1" node-forge@^0.7.1: - version "0.7.6" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" node-int64@^0.4.0: version "0.4.0" @@ -4760,9 +4748,9 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.0.0-alpha.11: - version "1.0.0-alpha.11" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" +node-releases@^1.0.0-alpha.10: + version "1.0.0-alpha.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.10.tgz#61c8d5f9b5b2e05d84eba941d05b6f5202f68a2a" dependencies: semver "^5.3.0" @@ -4823,8 +4811,8 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.2.0.tgz#98d0948afc82829f374320f405fe9ca55a5f8567" npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" npm-packlist@^1.1.6: version "1.1.11" @@ -4863,12 +4851,12 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" nwsapi@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.8.tgz#e3603579b7e162b3dbedae4fb24e46f771d8fa24" + version "2.0.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -4886,7 +4874,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.6.0: +object-inspect@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" @@ -4898,7 +4886,7 @@ object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6: +object-keys@^1.0.11, object-keys@^1.0.6, object-keys@^1.0.8: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -4908,7 +4896,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: +object.assign@^4.0.4, object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" dependencies: @@ -5215,8 +5203,8 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" path-parse@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" path-type@^1.0.0: version "1.1.0" @@ -5442,8 +5430,8 @@ postcss-merge-longhand@^2.0.1: postcss "^5.0.4" postcss-merge-longhand@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.4.tgz#bffc7c6ffa146591c993a0bb8373d65f9a06d4d0" + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.3.tgz#17f93b71d8a1dba043b7fb437f8e264304e64ab0" dependencies: css-color-names "0.0.4" postcss "^6.0.0" @@ -5777,7 +5765,7 @@ posthtml-parser@^0.4.0: htmlparser2 "^3.9.2" object-assign "^4.1.1" -posthtml-render@^1.1.0, posthtml-render@^1.1.3, posthtml-render@^1.1.4: +posthtml-render@^1.1.0, posthtml-render@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.1.4.tgz#95dac09892f4f183fad5ac823f08f42c0256551e" @@ -5846,8 +5834,8 @@ pseudomap@^1.0.1, pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" psl@^1.1.24: - version "1.1.29" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + version "1.1.28" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" public-encrypt@^4.0.0: version "4.0.2" @@ -5875,7 +5863,7 @@ q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -qs@~6.5.2: +qs@~6.5.1: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -5920,8 +5908,8 @@ randexp@0.4.6: ret "~0.1.10" randomatic@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" dependencies: is-number "^4.0.0" kind-of "^6.0.0" @@ -5982,16 +5970,16 @@ react-dom@^16.3.0: prop-types "^15.6.0" react-event-listener@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.3.tgz#8eab88129a76e095ed8aa684c29679eded1e843d" + version "0.6.2" + resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.2.tgz#df405e9578be052b77a76e4c3914686637caecff" dependencies: - "@babel/runtime" "7.0.0-rc.1" + "@babel/runtime" "7.0.0-beta.42" prop-types "^15.6.0" warning "^4.0.1" -react-is@^16.3.1, react-is@^16.4.2: - version "16.4.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88" +react-is@^16.3.1, react-is@^16.4.1: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" react-jss@^8.1.0: version "8.6.1" @@ -6028,13 +6016,13 @@ react-redux@^5.0.7: prop-types "^15.6.0" react-test-renderer@^16.0.0-0, react-test-renderer@^16.2.0: - version "16.4.2" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e" + version "16.4.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70" dependencies: fbjs "^0.8.16" object-assign "^4.1.1" prop-types "^15.6.0" - react-is "^16.4.2" + react-is "^16.4.1" react-transition-group@^2.2.1: version "2.4.0" @@ -6194,7 +6182,7 @@ regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" -regenerator-runtime@^0.11.0: +regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -6250,8 +6238,8 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" @@ -6278,29 +6266,29 @@ request-promise-native@^1.0.5: tough-cookie ">=2.3.3" request@^2.87.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" dependencies: aws-sign2 "~0.7.0" - aws4 "^1.8.0" + aws4 "^1.6.0" caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" + combined-stream "~1.0.5" + extend "~3.0.1" forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" + form-data "~2.3.1" + har-validator "~5.0.3" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" + mime-types "~2.1.17" + oauth-sign "~0.8.2" performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" tunnel-agent "^0.6.0" - uuid "^3.3.2" + uuid "^3.1.0" require-directory@^2.1.1: version "2.1.1" @@ -6434,7 +6422,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -6464,8 +6452,8 @@ sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" send@0.16.2: version "0.16.2" @@ -6669,8 +6657,8 @@ source-map-support@^0.4.15: source-map "^0.5.6" source-map-support@^0.5.0, source-map-support@~0.5.6: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6757,6 +6745,11 @@ stack-utils@^1.0.1: standard-engine@~8.0.0: version "8.0.1" resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-8.0.1.tgz#0b77be8d7ab963675717dbeac1ef1d6675fb62f0" + dependencies: + deglob "^2.1.0" + get-stdin "^6.0.0" + minimist "^1.1.0" + pkg-conf "^2.0.0" standard@^11.0.1: version "11.0.1" @@ -6896,13 +6889,14 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" styled-components@^3.2.5: - version "3.4.4" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.4.4.tgz#dbd2ea6338fb050b5b56783e189434fd7f18eda5" + version "3.3.3" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.3.3.tgz#09e702055ab11f7a8eab8229b1c0d0b855095686" dependencies: buffer "^5.0.3" css-to-react-native "^2.0.3" fbjs "^0.8.16" hoist-non-react-statics "^2.5.0" + is-plain-object "^2.0.1" prop-types "^15.5.4" react-is "^16.3.1" stylis "^3.5.0" @@ -6936,8 +6930,8 @@ supports-color@^3.1.2, supports-color@^3.2.3: has-flag "^1.0.0" supports-color@^5.3.0, supports-color@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" dependencies: has-flag "^3.0.0" @@ -6996,8 +6990,8 @@ table@4.0.2: string-width "^2.1.1" tar@^4: - version "4.4.6" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -7007,7 +7001,7 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -terser@^3.7.3, terser@^3.8.1: +terser@^3.7.3: version "3.8.1" resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.1.tgz#cb70070ac9e0a71add169dfb63c0a64fca2738ac" dependencies: @@ -7119,13 +7113,19 @@ tomlify-j0.4@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tomlify-j0.4/-/tomlify-j0.4-3.0.0.tgz#99414d45268c3a3b8bf38be82145b7bba34b7473" -tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: +tough-cookie@>=2.3.3, tough-cookie@^2.3.4: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" dependencies: psl "^1.1.24" punycode "^1.4.1" +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -7168,6 +7168,13 @@ ua-parser-js@^0.7.18: version "0.7.18" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" +uglify-es@^3.3.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -7266,17 +7273,17 @@ util@^0.10.3: dependencies: inherits "2.0.3" -uuid@^3.3.2: +uuid@^3.1.0: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" v8-compile-cache@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + version "2.0.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -7322,8 +7329,8 @@ warning@^3.0.0: loose-envify "^1.0.0" warning@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" + version "4.0.1" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.1.tgz#66ce376b7fbfe8a887c22bdf0e7349d73d397745" dependencies: loose-envify "^1.0.0" @@ -7349,20 +7356,20 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" dependencies: - iconv-lite "0.4.23" + iconv-lite "0.4.19" whatwg-fetch@>=0.10.0: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" -whatwg-mimetype@^2.1.0: +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" -whatwg-url@^6.4.1: +whatwg-url@^6.4.0, whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" dependencies: @@ -7370,14 +7377,6 @@ whatwg-url@^6.4.1: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"