Skip to content

Commit 6935ddf

Browse files
authored
Merge pull request #5997 from dojutsu-user/add-more-loggers
Fix logic involving creation of Sphinx Domains
2 parents 11ea9e6 + 803e89c commit 6935ddf

File tree

4 files changed

+136
-23
lines changed

4 files changed

+136
-23
lines changed

readthedocs/projects/tasks.py

+24
Original file line numberDiff line numberDiff line change
@@ -1404,10 +1404,34 @@ def warn(self, msg):
14041404
f'domain->name',
14051405
)
14061406
continue
1407+
1408+
# HACK: This is done because the difference between
1409+
# ``sphinx.builders.html.StandaloneHTMLBuilder``
1410+
# and ``sphinx.builders.dirhtml.DirectoryHTMLBuilder``.
1411+
# They both have different ways of generating HTML Files,
1412+
# and therefore the doc_name generated is different.
1413+
# More info on: http://www.sphinx-doc.org/en/master/usage/builders/index.html#builders
1414+
# Also see issue: https://github.com/readthedocs/readthedocs.org/issues/5821
1415+
if doc_name.endswith('/'):
1416+
doc_name += 'index.html'
1417+
14071418
html_file = HTMLFile.objects.filter(
14081419
project=version.project, version=version,
14091420
path=doc_name, build=build,
14101421
).first()
1422+
1423+
if not html_file:
1424+
log.debug('[%s] [%s] [Build: %s] HTMLFile object not found. File: %s' % (
1425+
version.project,
1426+
version,
1427+
build,
1428+
doc_name,
1429+
))
1430+
1431+
# Don't create Sphinx Domain objects
1432+
# if the HTMLFile object is not found.
1433+
continue
1434+
14111435
SphinxDomain.objects.create(
14121436
project=version.project,
14131437
version=version,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Test

readthedocs/rtd_tests/tests/test_imported_file.py

+77-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
# -*- coding: utf-8 -*-
2+
23
import os
4+
import mock
35

46
from django.test import TestCase
57

6-
from readthedocs.projects.models import ImportedFile, Project
7-
from readthedocs.projects.tasks import _create_imported_files, _sync_imported_files
8+
from readthedocs.projects.models import ImportedFile, Project, HTMLFile
9+
from readthedocs.projects.tasks import (
10+
_create_imported_files,
11+
_sync_imported_files,
12+
_create_intersphinx_data,
13+
)
14+
from readthedocs.sphinx_domains.models import SphinxDomain
815

916

1017
base_dir = os.path.dirname(os.path.dirname(__file__))
@@ -16,7 +23,7 @@ class ImportedFileTests(TestCase):
1623
def setUp(self):
1724
self.project = Project.objects.get(slug='pip')
1825
self.version = self.project.versions.first()
19-
26+
2027
def _manage_imported_files(self, version, path, commit, build):
2128
"""Helper function for the tests to create and sync ImportedFiles."""
2229
_create_imported_files(version, path, commit, build)
@@ -26,9 +33,9 @@ def test_properly_created(self):
2633
test_dir = os.path.join(base_dir, 'files')
2734
self.assertEqual(ImportedFile.objects.count(), 0)
2835
self._manage_imported_files(self.version, test_dir, 'commit01', 1)
29-
self.assertEqual(ImportedFile.objects.count(), 3)
36+
self.assertEqual(ImportedFile.objects.count(), 4)
3037
self._manage_imported_files(self.version, test_dir, 'commit01', 2)
31-
self.assertEqual(ImportedFile.objects.count(), 3)
38+
self.assertEqual(ImportedFile.objects.count(), 4)
3239

3340
def test_update_commit(self):
3441
test_dir = os.path.join(base_dir, 'files')
@@ -54,4 +61,68 @@ def test_update_content(self):
5461
self._manage_imported_files(self.version, test_dir, 'commit02', 2)
5562
self.assertNotEqual(ImportedFile.objects.get(name='test.html').md5, 'c7532f22a052d716f7b2310fb52ad981')
5663

57-
self.assertEqual(ImportedFile.objects.count(), 3)
64+
self.assertEqual(ImportedFile.objects.count(), 4)
65+
66+
@mock.patch('readthedocs.projects.tasks.os.path.exists')
67+
def test_create_intersphinx_data(self, mock_exists):
68+
mock_exists.return_Value = True
69+
70+
# Test data for objects.inv file
71+
test_objects_inv = {
72+
'cpp:function': {
73+
'sphinx.test.function': [
74+
'dummy-proj-1',
75+
'dummy-version-1',
76+
'test.html#epub-faq', # file generated by ``sphinx.builders.html.StandaloneHTMLBuilder``
77+
'dummy-func-name-1',
78+
]
79+
},
80+
'py:function': {
81+
'sample.test.function': [
82+
'dummy-proj-2',
83+
'dummy-version-2',
84+
'test.html#sample-test-func', # file generated by ``sphinx.builders.html.StandaloneHTMLBuilder``
85+
'dummy-func-name-2'
86+
]
87+
},
88+
'js:function': {
89+
'testFunction': [
90+
'dummy-proj-3',
91+
'dummy-version-3',
92+
'api/#test-func', # file generated by ``sphinx.builders.dirhtml.DirectoryHTMLBuilder``
93+
'dummy-func-name-3'
94+
]
95+
}
96+
}
97+
98+
with mock.patch(
99+
'sphinx.ext.intersphinx.fetch_inventory',
100+
return_value=test_objects_inv
101+
) as mock_fetch_inventory:
102+
103+
test_dir = os.path.join(base_dir, 'files')
104+
105+
_create_imported_files(self.version, test_dir, 'commit01', 1)
106+
_create_intersphinx_data(self.version, test_dir, 'commit01', 1)
107+
108+
# there will be two html files,
109+
# `api/index.html` and `test.html`
110+
self.assertEqual(
111+
HTMLFile.objects.all().count(),
112+
2
113+
)
114+
self.assertEqual(
115+
HTMLFile.objects.filter(path='api/index.html').count(),
116+
1
117+
)
118+
119+
html_file_api = HTMLFile.objects.filter(path='api/index.html').first()
120+
121+
self.assertEqual(
122+
SphinxDomain.objects.all().count(),
123+
3
124+
)
125+
self.assertEqual(
126+
SphinxDomain.objects.filter(html_file=html_file_api).count(),
127+
1
128+
)

readthedocs/search/documents.py

+34-17
Original file line numberDiff line numberDiff line change
@@ -111,23 +111,40 @@ class Meta:
111111

112112
def prepare_domains(self, html_file):
113113
"""Prepares and returns the values for domains field."""
114-
domains_qs = html_file.sphinx_domains.exclude(
115-
domain='std',
116-
type__in=['doc', 'label']
117-
).iterator()
118-
119-
all_domains = [
120-
{
121-
'role_name': domain.role_name,
122-
'doc_name': domain.doc_name,
123-
'anchor': domain.anchor,
124-
'type_display': domain.type_display,
125-
'doc_display': domain.doc_display,
126-
'name': domain.name,
127-
'display_name': domain.display_name if domain.display_name != '-' else '',
128-
}
129-
for domain in domains_qs
130-
]
114+
all_domains = []
115+
116+
try:
117+
domains_qs = html_file.sphinx_domains.exclude(
118+
domain='std',
119+
type__in=['doc', 'label']
120+
).iterator()
121+
122+
all_domains = [
123+
{
124+
'role_name': domain.role_name,
125+
'doc_name': domain.doc_name,
126+
'anchor': domain.anchor,
127+
'type_display': domain.type_display,
128+
'doc_display': domain.doc_display,
129+
'name': domain.name,
130+
'display_name': domain.display_name if domain.display_name != '-' else '',
131+
}
132+
for domain in domains_qs
133+
]
134+
135+
log.debug("[%s] [%s] Total domains for file %s are: %s" % (
136+
html_file.project.slug,
137+
html_file.version.slug,
138+
html_file.path,
139+
len(all_domains),
140+
))
141+
142+
except Exception:
143+
log.exception("[%s] [%s] Error preparing domain data for file %s" % (
144+
html_file.project.slug,
145+
html_file.version.slug,
146+
html_file.path,
147+
))
131148

132149
return all_domains
133150

0 commit comments

Comments
 (0)