-
Notifications
You must be signed in to change notification settings - Fork 250
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added Cell level control for Table Borders #1285
base: master
Are you sure you want to change the base?
Conversation
Hi @Lucas-C, I have made a PR to know if I am doing it correctly it is not a complete implementation, please see the code change and give me suggestions. |
fpdf/table.py
Outdated
@@ -849,6 +872,7 @@ class Cell: | |||
rowspan: int | |||
padding: Optional[Union[int, tuple, type(None)]] | |||
link: Optional[Union[str, int]] | |||
border: Optional[Union[str, int, CellBordersLayout]] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
border: Optional[Union[str, int, CellBordersLayout]] | |
border: Optional[CellBordersLayout] |
fpdf/table.py
Outdated
@@ -819,6 +840,7 @@ def cell( | |||
rowspan, | |||
padding, | |||
link, | |||
border, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
border, | |
CellBordersLayout.coerce(border), |
It's better to check if the value provided is valid early, and to always store an instance of CellBordersLayout
.
def get_cell_border(self, i, j, cell): | ||
""" | ||
Defines which cell borders should be drawn. | ||
Returns a string containing some or all of the letters L/R/T/B, | ||
to be passed to `fpdf.FPDF.multi_cell()`. | ||
Can be overriden to customize this logic | ||
""" | ||
|
||
if hasattr(cell, "border"): | ||
border = CellBordersLayout.coerce(cell.border) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not needed if you perform the call to .coerce()
in Row.cell()
fpdf/table.py
Outdated
border = CellBordersLayout.coerce(cell.border) | ||
|
||
if border != CellBordersLayout.INHERIT: | ||
border2 = [] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
border2 = [] | |
return str(border) |
I think it would be best to put this conversion-to-string logic in a method CellBordersLayout.__str__
Nice, thank you for creating a PR 🙂 I made a few comments. On thing that should come next is to add unit tests! 🙂 |
Hi, I made the suggested changes, now how can I fix this pylint warning, And please tell me where I should add the unit tests. |
It now seems to be passing, but you have however 27 failing tests.
You can add them to |
Hi @Lucas-C, should I write test just like this? and for all the different values like, def test_cell_border_left(tmp_path):
pdf = FPDF()
pdf.add_page()
pdf.set_font("Times", size=5)
with pdf.table( gutter_height=2, gutter_width=2) as table:
for data_row in TABLE_DATA:
row = table.row()
for datum in data_row:
row.cell(datum,border="left")
assert_pdf_equal(pdf, HERE / "test_cell_border_left.pdf", tmp_path) |
@Lucas-C is it the right way of writing the tests? |
Yes, this look likes a good start 👍 And testing many possible combination of values is also a good idea! |
is it fine @Lucas-C ? |
Fixes : #1192
Implemented a new feature that allows granular, cell-level control over table borders. With this update, users can now define specific borders (left, right, top, bottom) for individual cells, offering greater customization when generating tables in PDFs.
Checklist:
The GitHub pipeline is OK (green),
meaning that both
pylint
(static code analyzer) andblack
(code formatter) are happy with the changes of this PR.A unit test is covering the code added / modified by this PR
This PR is ready to be merged
In case of a new feature, docstrings have been added, with also some documentation in the
docs/
folderA mention of the change is present in
CHANGELOG.md
By submitting this pull request, I confirm that my contribution is made under the terms of the GNU LGPL 3.0 license.