def test_baseline_memory_sync(self): data1 = track({}, sync=MemoryConduit()) data2 = track({}, sync=MemoryConduit()) data1['a'] = 1 time.sleep(0.1) handler(data1).sync.stop() handler(data2).sync.stop() self.assertTrue(data1 == data2)
def test_existing_file(self): file_content = 'ä: 1\n' m = mock.mock_open(read_data=file_content) with mock.patch('tinysync.persistence.open', m): t = track({}, 'testing') m.assert_called_once_with('testing.yaml', encoding='utf-8') self.assertTrue(t['ä'] == 1)
def test_basics_list(self): l = [0, 1] t = track(l) self.assertTrue(istracked(t)) self.assertTrue(t.__subject__ == l) t[1] = ['a'] self.assertTrue(istracked(t[1]))
def test_lock_ctxtmgr(self): t = track({'a': 1}) with t: t._tracker.handler.lock.release() t._tracker.handler.lock.acquire() with self.assertRaises(RuntimeError): t._tracker.handler.lock.release()
def refresh_album_data(self): albums = self.driver.get_albums() for i, album in enumerate(albums): album = track(album) #self.status.text = f'{i+1}/{len(albums)} - {album.name}' #self.status.size_to_fit() #self.status.center = #self.bounds.center() if album.id not in self.albums: photos = [ { 'id': photo['id'], 'album_id': album.id, #'name': photo['name'], 'taken': str(self.get_datetime(photo)), #'size': photo['size'], 'height': photo['image']['height'], 'width': photo['image']['width'], #'url': photo['@microsoft.graph.downloadUrl'], } for photo in self.driver.get_children(album.id) if 'file' in photo and not 'video' in photo ] photos.sort(key=lambda p: p['taken']) self.albums[album.id] = { 'name': album.name, 'id': album.id, 'active': True, 'photos': photos } self.menu.data_source.refresh() if self.state.current_photo is None: self.state.current_photo = (album.id, 0)
def test_basics_dict(self): d = {'a': 1, 'b': 2} t = track(d) self.assertTrue(istracked(t)) self.assertTrue(t.__subject__ == d) t['b'] = [3] self.assertTrue(istracked(t['b']))
def test_new_file(self): m = mock.mock_open() with mock.patch('tinysync.persistence.open', m): t = track({'ä': 1}, 'testing') m.assert_any_call('testing.yaml', encoding='utf-8') m.assert_called_with('testing.yaml', 'w', encoding='utf-8') h = m() [h.write.assert_any_call(letter) for letter in 'ä: 1\n']
def test_change_callback(self): l = [0, [1]] def change_callback(data): self.assertTrue(type(data.name) == NoNameNoPersistence) self.assertTrue(data.path == [1]) self.assertTrue(data.target==l[1]) t = track(l, change_callback=change_callback) t[1][0] = 2
def test_change_action(self): l = [0, 1] check = [] def change_action(check): check.append(True) t = track(l, change_action=partial(change_action, check)) t[1] = 2 self.assertTrue(check[0])
def test_history(self): data = track({}, history=True) h = handler(data).history data['a'] = 5 data['a'] = [1, 2] self.assertTrue(h.capacity == 0) self.assertTrue(len(h) == 2) self.assertTrue(h.undo() == 1) self.assertTrue(h.active == 1) self.assertTrue(data['a'] == 5) self.assertTrue(h.redo() == 0) self.assertTrue(data['a'] == [1, 2])
def test_change_callback(self): l = [0, [1]] def change_callback(data): self.assertTrue(type(data.name) == NoNameNoPersistence) self.assertTrue(data.path == [1]) self.assertTrue(data.target == l[1]) self.assertTrue(data.func_name == '__setitem__') self.assertTrue(data.args == (0, 2)) t = track(l, change_callback=change_callback) t[1][0] = 2
def __init__(self, tableview): self.tableview = tableview self.ruoat = track([], 'ruoat') self.add_button = ui.ButtonItem( tint_color='black', title='Lisää', enabled=True, action=self.add, ) tableview.right_button_items = [self.add_button] self.last_created = None self.full_height = None
def test_atomic_ctxtmgr_exception(self): original = {'a': {'b': 1}} call_count = 0 def cb(data): nonlocal call_count call_count += 1 t = track(copy.deepcopy(original), change_callback=cb) with self.assertRaises(RuntimeError): with atomic(t): t['a']['b'] = [2, 3] raise RuntimeError('Something failed') self.assertTrue(t['a']['b'] == 1, t['a']['b']) self.assertTrue(t == original, t) self.assertTrue(istracked(t['a'])) self.assertTrue(call_count == 0, call_count)
def __init__(self, initial_value, content=None, data_id='default', persist=False, conduit=None, change_callback=None): super().__init__() self.initial_value = initial_value self.initial_checksum = Sync.generate_checksum(initial_value) self.content = content if content is not None else copy.deepcopy( self.initial_value) self.data_id = data_id self.conduit = conduit or MemoryConduit() self.change_callback = change_callback self.conduit.register_handler(self) self.state = tinysync.track({}, name=data_id + '-sync', dot_access=True, persist=persist)
def __init__(self, conduit=None, **kwargs): super().__init__(**kwargs) enable(self) self.background_color = .3 self.ball_views = {} more_b = Button(title='+', name='', background_color='blue', tint_color='lightblue', font=('<system-bold>', 32)) self.add_subview(more_b) more_b.dock.bottom_trailing() more_b.at.width == 40 more_b.at.height == 40 more_b.corner_radius = 20 more_b.action = self.add_ball self.balls = tinysync.track({}, name='balls', persist=False, sync=conduit, change_callback=self.update_view, dot_access=True)
for view in container.subviews: id = int(view.name) (x, y, color) = moving_balls[id] view.center = x, y needed.remove(id) for id in needed: (x, y, color) = moving_balls[id] view = MoveableView(name=str(id), background_color=color) container.add_subview(view) view.frame = (0, 0, 40, 40) view.corner_radius = 20 view.center = x, y more_b = Button(title='+', background_color='blue', tint_color='lightblue', font=('<system-bold>', 32)) v.add_subview(more_b) more_b.dock.bottom_trailing() more_b.at.width == 40 more_b.at.height == 40 more_b.corner_radius = 20 more_b.action = add_ball v.present() moving_balls = tinysync.track(moving_balls, change_action=functools.partial( update_view, passive))
return True def add(self, sender): self.ex.append({ 'title': '?', 'image_name': '', 'reps': '3x10', 'weight_mikael': 0, 'weight_oskari': 0, }) self.tableview.reload() if __name__ == '__main__': exercises = tinysync.track([], name='gym-program') v = ui.View(background_color='black', ) day_table = ui.TableView( background_color='black', frame=v.bounds, flex='WH', ) day_source = DaySource(day_table, exercises) day_table.data_source = day_source day_table.delegate = day_source n = anchor.NavigationView(day_table, navigation_bar_hidden=False,
def initialize_local(self): self.albums = track({}, str(self.folder / 'slideshow_album_data')) self.state = track({'current_photo': None}, str(self.folder / 'slideshow_state')) self.continuum = {}
def locate_photo(self, photo_spec, offset=0): album_id, photo_index = self.update_spec(photo_spec, offset) album = self.albums[album_id] photo = album.photos[photo_index] return track(photo)
def test_atomic_ctxtmgr_baseline(self): t = track({'a': 1}) with atomic(t): t['a'] = { 'b': [2, 3]} self.assertTrue(t['a']['b'][1] == 3) self.assertTrue(istracked(t['a']['b']))
def test_vanilla_copy(self): l = [0, { 'a': 1 }] t = track(l) back_to_l = copy.deepcopy(t) self.assertTrue(type(back_to_l) == list) self.assertTrue(type(back_to_l[1]) == dict)
def test_basics_set(self): s = {'a', 'b'} t = track(s) self.assertTrue(istracked(t)) self.assertTrue(t.__subject__ == s)