Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions ietf/sync/rfcindex.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,71 @@ def get_bcp_text_index_entries():
return entries


def get_std_text_index_entries():
"""Returns STD entries for std-index.txt"""
entries = []

highest_std_number = (
Document.objects.filter(type_id="std")
.annotate(
number=Cast(
Substr("name", 4, None),
output_field=models.IntegerField(),
)
)
.order_by("-number")
.first()
.number
)

for std_number in range(1, highest_std_number + 1):
std_name = f"STD{std_number}"
std = Document.objects.filter(type_id="std", name=f"{std_name.lower()}").first()

if std and std.contains():
entry = subseries_text_line(
(
f"[{std_name}]"
f"{' ' * (SS_TXT_CUE_COL_WIDTH - len(std_name) - 2 - SS_TXT_MARGIN)}"
f"Internet Standard {std_number},"
),
first=True,
)
entry += "\n"
entry += subseries_text_line(
f"<{settings.RFC_EDITOR_INFO_BASE_URL}{std_name.lower()}>."
)
entry += "\n"
entry += subseries_text_line(
"At the time of writing, this STD comprises the following:"
)
entry += "\n\n"
rfcs = sorted(std.contains(), key=lambda x: x.rfc_number)
for rfc in rfcs:
authors = ", ".join(
author.format_for_titlepage() for author in rfc.rfcauthor_set.all()
)
entry += subseries_text_line(
(
f'{authors}, "{rfc.title}", STD¶{std_number}, RFC¶{rfc.rfc_number}, '
f"DOI¶{rfc.doi}, {rfc.pub_date().strftime('%B %Y')}, "
f"<{settings.RFC_EDITOR_INFO_BASE_URL}rfc{rfc.rfc_number}>."
)
).replace("¶", " ")
entry += "\n\n"
else:
entry = subseries_text_line(
(
f"[{std_name}]"
f"{' ' * (SS_TXT_CUE_COL_WIDTH - len(std_name) - 2 - SS_TXT_MARGIN)}"
f"Internet Standard {std_number} currently contains no RFCs"
),
first=True,
)
entries.append(entry)
return entries


def add_subseries_xml_index_entries(rfc_index, ss_type, include_all=False):
"""Add subseries entries for rfc-index.xml"""
# subseries docs annotated with numeric number
Expand Down Expand Up @@ -579,3 +644,18 @@ def create_bcp_txt_index():
},
)
save_to_red_bucket("bcp-index.txt", index)


def create_std_txt_index():
"""Create text index of STDs"""
DATE_FMT = "%m/%d/%Y"
created_on = timezone.now().strftime(DATE_FMT)
log("Creating std-index.txt")
index = render_to_string(
"sync/std-index.txt",
{
"created_on": created_on,
"stds": get_std_text_index_entries(),
},
)
save_to_red_bucket("std-index.txt", index)
64 changes: 62 additions & 2 deletions ietf/sync/tests_rfcindex.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

from ietf.doc.factories import (
BcpFactory,
StdFactory,
IndividualRfcFactory,
PublishedRfcDocEventFactory,
)
Expand All @@ -17,6 +18,7 @@
create_bcp_txt_index,
create_rfc_txt_index,
create_rfc_xml_index,
create_std_txt_index,
format_rfc_number,
get_april1_rfc_numbers,
get_publication_std_levels,
Expand Down Expand Up @@ -78,6 +80,9 @@ def setUp(self):
# Create a BCP with non-April Fools RFC
self.bcp = BcpFactory(contains=[self.rfc], name="bcp11")

# Create a STD with non-April Fools RFC
self.std = StdFactory(contains=[self.rfc], name="std11")

# Set up a publication-std-levels.json file to indicate the publication
# standard of self.rfc as different from its current value
red_bucket.save(
Expand Down Expand Up @@ -146,7 +151,7 @@ def test_create_rfc_xml_index(self, mock_save):

children = list(index) # elements as list
# Should be one rfc-not-issued-entry
self.assertEqual(len(children), 14)
self.assertEqual(len(children), 15)
self.assertEqual(
[
c.find(f"{ns}doc-id").text
Expand Down Expand Up @@ -236,7 +241,62 @@ def test_create_bcp_txt_index(self, mock_save):
contents,
)
self.assertIn(
f'BCP 11, RFC {self.rfc.rfc_number},',
"BCP 11,",
contents,
)
self.assertIn(
f"RFC {self.rfc.rfc_number},",
contents,
)

@override_settings(RFCINDEX_INPUT_PATH="input/")
@mock.patch("ietf.sync.rfcindex.save_to_red_bucket")
def test_create_std_txt_index(self, mock_save):
create_std_txt_index()
self.assertEqual(mock_save.call_count, 1)
self.assertEqual(mock_save.call_args[0][0], "std-index.txt")
contents = mock_save.call_args[0][1]
self.assertTrue(isinstance(contents, str))
# starts from 1
self.assertIn(
"[STD1]",
contents,
)
# fill up to 11
self.assertIn(
"[STD10]",
contents,
)
# but not to 12
self.assertNotIn(
"[STD12]",
contents,
)
# Test empty STDs
self.assertIn(
"Internet Standard 9 currently contains no RFCs",
contents,
)
# No zero prefix!
self.assertNotIn(
"[STD0001]",
contents,
)
# Has STD11 with a RFC
self.assertIn(
"Internet Standard 11,",
contents,
)
self.assertIn(
f'"{self.rfc.title}"',
contents,
)
self.assertIn(
"STD 11,",
contents,
)
self.assertIn(
f"RFC {self.rfc.rfc_number},",
contents,
)

Expand Down
51 changes: 51 additions & 0 deletions ietf/templates/sync/std-index.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

STD INDEX
-------------

(CREATED ON: {{created_on}}.)

This file contains citations for all STDs in numeric order. Each
STD represents a single Internet Standard technical specification,
composed of one or more RFCs with Internet Standard status.

STD citations appear in this format:

[STD#] Best Current Practice #,
<STD URL>.
At the time of writing, this STD comprises the following:

Author 1, Author 2, "Title of the RFC", STD #, RFC №,
DOI DOI string, Issue date,
<RFC URL>.

For example:

[STD6] Internet Standard 6,
<https://www.rfc-editor.org/info/std6>.
At the time of writing, this STD comprises the following:

J. Postel, "User Datagram Protocol", STD 6, RFC 768,
DOI 10.17487/RFC0768, August 1980,
<https://www.rfc-editor.org/info/rfc768>.

Key to fields:

# is the STD number.

№ is the RFC number.

STDs and other RFCs may be obtained from https://www.rfc-editor.org.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

STD INDEX
---------



{% for std in stds %}{{std|safe}}

{% endfor %}
Loading