Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_address_range():
a = AddressRange('a1:b2')
b = AddressRange('A1:B2')
c = AddressRange(a)
assert a == b
assert b == c
assert b == AddressRange(b)
assert b == AddressRange.create(b)
assert AddressRange('sh!a1:b2') == AddressRange(a, sheet='sh')
assert AddressCell('C13') == AddressCell('R13C3')
with pytest.raises(ValueError):
AddressRange(AddressRange('sh!a1:b2'), sheet='sheet')
a = AddressRange('A:A')
assert 'A' == a.start.column
assert 'A' == a.end.column
assert 0 == a.start.row
assert 0 == a.end.row
b = AddressRange('1:1')
assert '' == b.start.column
def test_address_pickle(tmpdir):
addrs = [
AddressRange('B1'),
AddressRange('B1:C1'),
AddressRange('B1:B2'),
AddressRange('B1:C2'),
AddressRange('sh!B1'),
AddressRange('sh!B1:C1'),
AddressRange('sh!B1:B2'),
AddressRange('sh!B1:C2'),
AddressRange('B:C'),
AddressRange('2:4'),
AddressCell('sh!XFC1048575'),
AddressCell('sh!XFD1048576'),
AddressCell('sh!A1'),
AddressCell('sh!E5'),
AddressCell('sh!F6'),
]
filename = os.path.join(str(tmpdir), 'test_addrs.pkl')
with open(filename, 'wb') as f:
pickle.dump(addrs, f)
with open(filename, 'rb') as f:
new_addrs = pickle.load(f)
assert addrs == new_addrs
def test_address_range():
a = AddressRange('a1:b2')
b = AddressRange('A1:B2')
c = AddressRange(a)
assert a == b
assert b == c
assert b == AddressRange(b)
assert b == AddressRange.create(b)
assert AddressRange('sh!a1:b2') == AddressRange(a, sheet='sh')
assert AddressCell('C13') == AddressCell('R13C3')
with pytest.raises(ValueError):
AddressRange(AddressRange('sh!a1:b2'), sheet='sheet')
a = AddressRange('A:A')
assert 'A' == a.start.column
def test_evaluate_conditional_formatting(cond_format_ws):
cells_addrs = [
AddressCell('B2'),
AddressCell('Sheet1!B3'),
AddressRange('Sheet1!B4:B6'),
]
formats = cond_format_ws.eval_conditional_formats(cells_addrs)
formats2 = cond_format_ws.eval_conditional_formats((a for a in cells_addrs))
assert formats == list(formats2)
assert len(formats) == 3
assert len(formats[2]) == 3
# read the spreadsheet from yaml
cond_format_ws.to_file(file_types=('yml', ))
cond_format_ws_yaml = ExcelCompiler.from_file(
cond_format_ws.filename + '.yml')
cells_addrs[0] = AddressCell('Sheet1!B2')
formats3 = cond_format_ws_yaml.eval_conditional_formats(tuple(cells_addrs))
assert formats2 == formats3
# read the spreadsheet from pickle
def test_address_range_and(left, right, result):
result = AddressRange(result)
assert AddressRange(left) & AddressRange(right) == result
assert AddressRange(left) & right == result
assert left & AddressRange(right) == result
flow of the equations.
"""
if not is_address(seed):
if isinstance(seed, str):
seed = AddressRange(seed)
elif isinstance(seed, collections.abc.Iterable):
for s in seed:
self._gen_graph(s, recursed=True)
self._process_gen_graph()
return
else:
raise ValueError('Unknown seed: {}'.format(seed))
# get/set the current sheet
if not seed.has_sheet:
seed = AddressRange(seed, sheet=self.excel.get_active_sheet_name())
if '[' in seed.sheet:
raise NotImplementedError('Linked SheetNames')
if seed.address in self.cell_map:
# already did this cell/range
return
# process the seed
self._make_cells(seed)
if not recursed:
# if not entered to process one cell / cellrange process other work
self._process_gen_graph()
def _gen_graph(self, seed, recursed=False):
"""Given a starting point (e.g., A6, or A3:B7) on a particular sheet,
generate a Spreadsheet instance that captures the logic and control
flow of the equations.
"""
if not is_address(seed):
if isinstance(seed, str):
seed = AddressRange(seed)
elif isinstance(seed, collections.abc.Iterable):
for s in seed:
self._gen_graph(s, recursed=True)
self._process_gen_graph()
return
else:
raise ValueError('Unknown seed: {}'.format(seed))
# get/set the current sheet
if not seed.has_sheet:
seed = AddressRange(seed, sheet=self.excel.get_active_sheet_name())
if '[' in seed.sheet:
raise NotImplementedError('Linked SheetNames')
if seed.address in self.cell_map:
key=lambda x: AddressRange(x[0]).sort_key
)),
end_row = new_row + height - 1
new_col = base_addr.col_idx + col_inc
end_col = new_col + width - 1
if new_row <= 0 or end_row > MAX_ROW or new_col <= 0 or end_col > MAX_COL:
return REF_ERROR
top_left = AddressCell((new_col, new_row, new_col, new_row),
sheet=base_addr.sheet)
if height == width == 1:
return top_left
else:
bottom_right = AddressCell((end_col, end_row, end_col, end_row),
sheet=base_addr.sheet)
return AddressRange('{}:{}'.format(
top_left.coordinate, bottom_right.coordinate),
sheet=top_left.sheet)
def get_range(self, address):
if not isinstance(address, (AddressRange, AddressCell)):
address = AddressRange(address)
if address.has_sheet:
sheet = self.workbook[address.sheet]
sheet_dataonly = self.workbook_dataonly[address.sheet]
else:
sheet = self.workbook.active
sheet_dataonly = self.workbook_dataonly.active
with mock.patch('openpyxl.worksheet._reader.from_excel',
self.from_excel):
# work around type coercion to datetime that causes some issues
if address.is_unbounded_range:
# bound the address range to the data in the spreadsheet
address = address & AddressRange(
(1, 1, *self.max_col_row(sheet.title)),