pyDiffTools 0.1.40__tar.gz → 0.1.41__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. {pydifftools-0.1.40/pyDiffTools.egg-info → pydifftools-0.1.41}/PKG-INFO +1 -1
  2. {pydifftools-0.1.40 → pydifftools-0.1.41/pyDiffTools.egg-info}/PKG-INFO +1 -1
  3. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/continuous.py +1 -1
  4. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/wrap_sentences.py +56 -12
  5. {pydifftools-0.1.40 → pydifftools-0.1.41}/pyproject.toml +1 -1
  6. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_wrap_check.py +45 -0
  7. {pydifftools-0.1.40 → pydifftools-0.1.41}/LICENSE.md +0 -0
  8. {pydifftools-0.1.40 → pydifftools-0.1.41}/MANIFEST.in +0 -0
  9. {pydifftools-0.1.40 → pydifftools-0.1.41}/README.rst +0 -0
  10. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/_quarto.yml +0 -0
  11. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/__version__.txt +0 -0
  12. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/1a724af72b16f5a9e607e12b1c721645/base.ipynb +0 -0
  13. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/1b28fc9daac9081847e5161b2c546f8a/base.ipynb +0 -0
  14. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/231f64eee282fa225d1104935cf80a24/base.ipynb +0 -0
  15. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/26e56f6b0ff54851a45145157f2f0dc4/base.ipynb +0 -0
  16. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/311fabd7029ffd050d056e2f316eb50f/base.ipynb +0 -0
  17. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/57da2021e5b156ac3adf01398201c723/base.ipynb +0 -0
  18. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/62b24ea7da75011d92b0f8924faa208d/base.ipynb +0 -0
  19. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/7f1b20d69d889514ab5d1cc92e3cb14f/base.ipynb +0 -0
  20. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/86f74c8c54a87ff892d9b15dd714e8f0/base.ipynb +0 -0
  21. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/88893b4234eac2945d9d6cb2e277f186/base.ipynb +0 -0
  22. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/9a40046ada6f582ee34af00fbdbfb417/base.ipynb +0 -0
  23. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/a1bf4d270d0641ff41faf1d7cce3439a/base.ipynb +0 -0
  24. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/a3789f7d9585a781f2a1c60ce95ff10d/base.ipynb +0 -0
  25. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/be46ecba858d39ad5f0c46902ddf1c02/base.ipynb +0 -0
  26. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/d0cbc57a12f2ccce710a5afd04cc05e7/base.ipynb +0 -0
  27. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/d3e12d320b14228f701231ae32ddd7dd/base.ipynb +0 -0
  28. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/eb434f61555438d020a6970a5dbf9ee8/base.ipynb +0 -0
  29. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/f6b0e73aa7fa029134665d4dde57e096/base.ipynb +0 -0
  30. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/f719a6e4ff09873cb0ffb06ec9d232f9/base.ipynb +0 -0
  31. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/executed/feeee244a7ce3d60e1a227eb604df823/base.ipynb +0 -0
  32. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/.jupyter_cache/global.db +0 -0
  33. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/example.qmd +0 -0
  34. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/example.tex +0 -0
  35. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/index.qmd +0 -0
  36. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/.jupyter_cache/__version__.txt +0 -0
  37. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/.jupyter_cache/executed/ca90e4df5f4f0583df6554156a68dc7f/base.ipynb +0 -0
  38. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/.jupyter_cache/global.db +0 -0
  39. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/end_vs_he_sketch.jpg +0 -0
  40. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/independent.qmd +0 -0
  41. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/index.qmd +0 -0
  42. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/tasks.qmd +0 -0
  43. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/test_include.qmd +0 -0
  44. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/subproject1/tryforerror.qmd +0 -0
  45. {pydifftools-0.1.40 → pydifftools-0.1.41}/example_notebook/project1/test_include.qmd +0 -0
  46. {pydifftools-0.1.40 → pydifftools-0.1.41}/pyDiffTools.egg-info/SOURCES.txt +0 -0
  47. {pydifftools-0.1.40 → pydifftools-0.1.41}/pyDiffTools.egg-info/dependency_links.txt +0 -0
  48. {pydifftools-0.1.40 → pydifftools-0.1.41}/pyDiffTools.egg-info/entry_points.txt +0 -0
  49. {pydifftools-0.1.40 → pydifftools-0.1.41}/pyDiffTools.egg-info/requires.txt +0 -0
  50. {pydifftools-0.1.40 → pydifftools-0.1.41}/pyDiffTools.egg-info/top_level.txt +0 -0
  51. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/__init__.py +0 -0
  52. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/bibliography.py +0 -0
  53. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/browser_lifecycle.py +0 -0
  54. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/check_numbers.py +0 -0
  55. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/citation_dialog.py +0 -0
  56. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/command_line.py +0 -0
  57. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/command_registry.py +0 -0
  58. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/comment_functions.py +0 -0
  59. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/comment_migration.py +0 -0
  60. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/comment_tags.lua +0 -0
  61. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/comment_tags_margin.lua +0 -0
  62. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/comment_tags_no_comments.lua +0 -0
  63. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/comment_toggle.js +0 -0
  64. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/comments.css +0 -0
  65. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/copy_files.py +0 -0
  66. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/diff-doc.js +0 -0
  67. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/doc_contents.py +0 -0
  68. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/flowchart/__init__.py +0 -0
  69. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/flowchart/comparison.py +0 -0
  70. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/flowchart/dot_to_yaml.py +0 -0
  71. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/flowchart/graph.py +0 -0
  72. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/flowchart/svg-pan-zoom.min.js +0 -0
  73. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/flowchart/watch_graph.py +0 -0
  74. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/flowchart/wgrph_view.js +0 -0
  75. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/forward_search.py +0 -0
  76. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/git_gd.py +0 -0
  77. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/git_gd_history.py +0 -0
  78. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/git_gd_image.py +0 -0
  79. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/git_gd_qt.py +0 -0
  80. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/html_comments.py +0 -0
  81. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/html_uncomments.py +0 -0
  82. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/log_example.py +0 -0
  83. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/match_spaces.py +0 -0
  84. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/notebook/__init__.py +0 -0
  85. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/notebook/display.py +0 -0
  86. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/notebook/fast_build.py +0 -0
  87. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/notebook/tex_to_qmd.py +0 -0
  88. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/onewordify.py +0 -0
  89. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/onewordify_undo.py +0 -0
  90. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/outline.py +0 -0
  91. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/rearrange_tex.py +0 -0
  92. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/searchacro.py +0 -0
  93. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/separate_comments.py +0 -0
  94. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/split_conflict.py +0 -0
  95. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/unseparate_comments.py +0 -0
  96. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/update_check.py +0 -0
  97. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/xml2xlsx.vbs +0 -0
  98. {pydifftools-0.1.40 → pydifftools-0.1.41}/pydifftools/zotero.py +0 -0
  99. {pydifftools-0.1.40 → pydifftools-0.1.41}/setup.cfg +0 -0
  100. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_bibliography.py +0 -0
  101. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_browser_lifecycle.py +0 -0
  102. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_check_single_use.py +0 -0
  103. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_command_line_help.py +0 -0
  104. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_comment_migration.py +0 -0
  105. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_continuous_shutdown.py +0 -0
  106. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_forward_search.py +0 -0
  107. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_git_gd_history.py +0 -0
  108. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_git_gd_image.py +0 -0
  109. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_git_gd_qt.py +0 -0
  110. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_rrng.py +0 -0
  111. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_tex_to_qmd.py +0 -0
  112. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_update_check.py +0 -0
  113. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_wrapping.py +0 -0
  114. {pydifftools-0.1.40 → pydifftools-0.1.41}/tests/test_zotero.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyDiffTools
3
- Version: 0.1.40
3
+ Version: 0.1.41
4
4
  Summary: Diff tools
5
5
  Author: J M Franck
6
6
  License: Copyright (c) 2015, jmfranck
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyDiffTools
3
- Version: 0.1.40
3
+ Version: 0.1.41
4
4
  Summary: Diff tools
5
5
  Author: J M Franck
6
6
  License: Copyright (c) 2015, jmfranck
@@ -310,7 +310,7 @@ def run_pandoc(
310
310
 
311
311
  automatic_fixes_were_made = False
312
312
  while True:
313
- report = autofix_markdown_file(filename, wrapnumber=55)
313
+ report = autofix_markdown_file(filename, max_line_length=79)
314
314
  automatic_fixes_were_made |= bool(report["fixes"])
315
315
  if report["fixes"] or report["warnings"]:
316
316
  user_says_fixed = show_markdown_fix_dialog(report)
@@ -1004,9 +1004,13 @@ def _iter_block_spans(blocks, wrapnumber, line_start=1):
1004
1004
 
1005
1005
 
1006
1006
  def markdown_lint_issues_from_text(
1007
- content, wrapnumber=45, punctuation_slop=20
1007
+ content, wrapnumber=45, punctuation_slop=20, max_line_length=None
1008
1008
  ):
1009
- """Return Markdown writing issues, including unfinished source spans."""
1009
+ """Return Markdown writing issues, including unfinished source spans.
1010
+
1011
+ With `max_line_length`, a prose line is only too long when it holds
1012
+ more than that many characters, instead of wr's greedy line choice.
1013
+ """
1010
1014
  def mask_comment(match):
1011
1015
  return "".join("\n" if char == "\n" else " " for char in match[0])
1012
1016
 
@@ -1016,13 +1020,30 @@ def markdown_lint_issues_from_text(
1016
1020
  # trailing spaces are reported separately below, and a double space
1017
1021
  # (a hard line break) must not look like a sentence ending mid-line
1018
1022
  prose_content = re.sub(r"[ \t]+$", "", prose_content, flags=re.M)
1019
- issues = [
1020
- issue
1021
- for line, width, span in _iter_block_spans(
1022
- markdown_blocks(prose_content), wrapnumber
1023
- )
1024
- for issue in check_prose(span, width, punctuation_slop, line)
1025
- ]
1023
+ issues = []
1024
+ prose_lines = prose_content.splitlines()
1025
+ for line, width, span in _iter_block_spans(
1026
+ markdown_blocks(prose_content), wrapnumber
1027
+ ):
1028
+ for issue in check_prose(span, width, punctuation_slop, line):
1029
+ if max_line_length is None or not issue[1].startswith(
1030
+ "line too long:"
1031
+ ):
1032
+ issues.append(issue)
1033
+ if max_line_length is not None:
1034
+ # {{{ flag prose lines longer than the character limit
1035
+ for number in range(line, line + len(span.splitlines())):
1036
+ text = prose_lines[number - 1]
1037
+ # a single unbreakable word cannot be shortened
1038
+ if len(text) > max_line_length and len(
1039
+ WORD.findall(text)
1040
+ ) > 1:
1041
+ issues.append((
1042
+ number,
1043
+ f"line over {max_line_length} characters: break "
1044
+ "it at a word boundary",
1045
+ ))
1046
+ # }}}
1026
1047
  issues.extend(
1027
1048
  (issue["line"], issue["message"])
1028
1049
  for issue in unclosed_markdown_spans(content)
@@ -1208,7 +1229,25 @@ def apply_markdown_issue_fix(content, line_number, message):
1208
1229
  old_line[:-1],
1209
1230
  "A line ended with a single stray space. I removed it.",
1210
1231
  )
1211
- if message.startswith("line too long:"):
1232
+ if message.startswith("line over "):
1233
+ # {{{ break at the last word boundary that fits the limit
1234
+ limit = int(re.match(r"line over (\d+)", message)[1])
1235
+ gaps = [
1236
+ found.end()
1237
+ for found in WORD.finditer(old_line)
1238
+ if container.end() < found.end() < len(old_line.rstrip())
1239
+ ]
1240
+ fitting = [gap for gap in gaps if gap <= limit]
1241
+ # when even the first word is too long, break right after it
1242
+ split_at = fitting[-1] if fitting else gaps[0]
1243
+ first = old_line[:split_at].rstrip()
1244
+ second = old_line[split_at:].lstrip(" \t")
1245
+ reason = (
1246
+ f"This line was longer than {limit} characters. "
1247
+ "I moved the last words onto a new line."
1248
+ )
1249
+ # }}}
1250
+ elif message.startswith("line too long:"):
1212
1251
  match = re.search(r"after '(.+?)' \(before '(.+?)'\); move", message)
1213
1252
  if match is None:
1214
1253
  raise ValueError(
@@ -1259,7 +1298,9 @@ def apply_markdown_issue_fix(content, line_number, message):
1259
1298
  return "".join(lines), old_line, after, reason
1260
1299
 
1261
1300
 
1262
- def autofix_markdown_file(filename, wrapnumber=55, punctuation_slop=20):
1301
+ def autofix_markdown_file(
1302
+ filename, wrapnumber=55, punctuation_slop=20, max_line_length=None
1303
+ ):
1263
1304
  """Apply safe source line breaks and report unfinished source spans."""
1264
1305
  with open(filename, encoding="utf-8", newline="") as fp:
1265
1306
  content = fp.read()
@@ -1268,7 +1309,10 @@ def autofix_markdown_file(filename, wrapnumber=55, punctuation_slop=20):
1268
1309
  # issue at a time re-lints the whole file for every single fix.
1269
1310
  for _ in range(100):
1270
1311
  issues = markdown_lint_issues_from_text(
1271
- content, wrapnumber=wrapnumber, punctuation_slop=punctuation_slop
1312
+ content,
1313
+ wrapnumber=wrapnumber,
1314
+ punctuation_slop=punctuation_slop,
1315
+ max_line_length=max_line_length,
1272
1316
  )
1273
1317
  fixable = {}
1274
1318
  for line_number, message in issues:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyDiffTools"
7
- version = "0.1.40"
7
+ version = "0.1.41"
8
8
  authors = [{ name = "J M Franck" }]
9
9
  description = "Diff tools"
10
10
  readme = "README.rst"
@@ -253,6 +253,51 @@ def test_autofix_fixes_every_line_in_one_pass_from_the_end(tmp_path):
253
253
  assert markdown_lint_issues_from_text(fixed, wrapnumber=55) == []
254
254
 
255
255
 
256
+ def test_character_limit_ignores_lines_wr_would_break_sooner():
257
+ # from RM_ESR: 74 characters, which wr's width-55 rule would break
258
+ source = (
259
+ "temperatures not amenable to other methods, as in "
260
+ "[@Banerjee2009ESREviCoe].\n"
261
+ )
262
+
263
+ assert markdown_lint_issues_from_text(source, 55) != []
264
+ assert markdown_lint_issues_from_text(source, max_line_length=79) == []
265
+
266
+
267
+ @pytest.mark.parametrize("prefix", ["", "- ", "> "])
268
+ def test_character_limit_breaks_at_last_fitting_word(tmp_path, prefix):
269
+ # from RM_ESR: a sentence that grew past 79 characters
270
+ line = (
271
+ prefix + "This script determines the field positions and amplitudes "
272
+ "of the spectral lines for an entire variable-temperature "
273
+ "experiment.\n"
274
+ )
275
+ path = tmp_path / "source.md"
276
+ path.write_text(line)
277
+
278
+ issues = markdown_lint_issues_from_text(line, max_line_length=79)
279
+ report = autofix_markdown_file(path, max_line_length=79)
280
+
281
+ fixed = path.read_text()
282
+ assert [message.split(":")[0] for _, message in issues] == [
283
+ "line over 79 characters"
284
+ ]
285
+ assert "79 characters" in report["fixes"][0]["reason"]
286
+ assert all(len(text) <= 79 for text in fixed.splitlines())
287
+ assert fixed.replace("\n> ", "\n").split() == line.split()
288
+ # the first line is filled as far as the limit allows
289
+ first = fixed.splitlines()[0]
290
+ next_word = line.split()[len(first.split())]
291
+ assert len(first) + 1 + len(next_word) > 79
292
+ assert markdown_lint_issues_from_text(fixed, max_line_length=79) == []
293
+
294
+
295
+ def test_character_limit_skips_a_single_unbreakable_word():
296
+ source = "https://example.org/" + "x" * 90 + "\n"
297
+
298
+ assert markdown_lint_issues_from_text(source, max_line_length=79) == []
299
+
300
+
256
301
  def test_unclosed_math_is_reported_after_fifty_lines():
257
302
  short_math = "$$\n" + ("x = y\n" * 48)
258
303
  long_math = "$$\n" + ("x = y\n" * 49)
File without changes
File without changes
File without changes
File without changes