def test_basic_incremental(self): inp = (u'index.markdown\n' '\tsection.markdown') sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'# My documentation\n')) self.__create_md_file('section.markdown', (u'# My section\n')) self.tree.parse_sitemap(sitemap) # Building from scratch, all pages are stale self.assertSetEqual(set(self.tree.get_stale_pages()), set([u'index.markdown', u'section.markdown'])) self.tree.persist() self.incremental = True self.tree = Tree(self, self) self.tree.parse_sitemap(sitemap) # Nothing changed, no page is stale self.assertSetEqual(set(self.tree.get_stale_pages()), set({})) # But we still have our pages self.assertSetEqual(set(self.tree.get_pages()), set([u'index.markdown', u'section.markdown'])) touch(os.path.join(self.__md_dir, u'section.markdown')) self.tree = Tree(self, self) self.tree.parse_sitemap(sitemap) self.assertSetEqual(set(self.tree.get_stale_pages()), set([u'section.markdown']))
def parse_config(self, config, toplevel=False): """Parses @config setting up @self state.""" self.sitemap_path = config.get_path('sitemap') if self.sitemap_path is None: error('invalid-config', 'No sitemap was provided') self.include_paths = OrderedSet([]) index_file = config.get_index() if index_file: if not os.path.exists(index_file): error('invalid-config', 'The provided index "%s" does not exist' % index_file) self.include_paths |= OrderedSet([os.path.dirname(index_file)]) self.include_paths |= OrderedSet(config.get_paths('include_paths')) self.is_toplevel = toplevel self.tree = Tree(self, self.app) self.__create_extensions() for extension in list(self.extensions.values()): if toplevel: extension.parse_toplevel_config(config) extension.parse_config(config) if not toplevel and config.conf_file: self.app.change_tracker.add_hard_dependency(config.conf_file) self.extra_asset_folders = OrderedSet(config.get_paths('extra_assets'))
def setUp(self): here = os.path.dirname(__file__) self.__md_dir = os.path.abspath(os.path.join( here, 'tmp-markdown-files')) self.private_folder = os.path.abspath(os.path.join( here, 'tmp-private')) self.__src_dir = os.path.abspath(os.path.join( here, 'tmp-src-files')) self.__output_dir = os.path.abspath(os.path.join( here, 'tmp-output')) self.__remove_tmp_dirs() os.mkdir(self.__md_dir) os.mkdir(self.private_folder) os.mkdir(self.__src_dir) os.mkdir(self.get_generated_doc_folder()) self.include_paths = OrderedSet([self.__md_dir]) self.include_paths.add(self.get_generated_doc_folder()) self.dependency_map = {} # Using the real doc database is too costly, tests should be lightning # fast (and they are) self.database = Database(self.private_folder) self.link_resolver = LinkResolver(self.database) self.change_tracker = ChangeTracker() self.sitemap_parser = SitemapParser() self.project_name = 'test-project' self.sanitized_name = 'test-project-0.1' self.incremental = False self.tree = Tree(self, self) self.test_ext = TestExtension(self, self) self.core_ext = CoreExtension(self, self) cfg = Config() self.test_ext.parse_toplevel_config(cfg) self.test_ext.parse_config(cfg) self.core_ext.parse_toplevel_config(cfg) self.core_ext.parse_config(cfg) self.subprojects = {} self.is_toplevel = True
def setUp(self): self._here = os.path.dirname(__file__) self._md_dir = os.path.abspath(os.path.join( self._here, 'tmp-markdown-files')) self.private_folder = os.path.abspath(os.path.join( self._here, 'tmp-private')) self._src_dir = os.path.abspath(os.path.join( self._here, 'tmp-src-files')) self._output_dir = os.path.abspath(os.path.join( self._here, 'tmp-output')) self._remove_tmp_dirs() os.mkdir(self._md_dir) os.mkdir(self.private_folder) os.mkdir(self._src_dir) self.dependency_map = {} self.database = Database(self.private_folder) self.link_resolver = LinkResolver(self.database) self.sanitized_name = 'test-project-0.1' self.tree = Tree(self, self)
def setUp(self): self._here = os.path.dirname(__file__) self._md_dir = os.path.abspath( os.path.join(self._here, 'tmp-markdown-files')) self.private_folder = os.path.abspath( os.path.join(self._here, 'tmp-private')) self._src_dir = os.path.abspath( os.path.join(self._here, 'tmp-src-files')) self._output_dir = os.path.abspath( os.path.join(self._here, 'tmp-output')) self._remove_tmp_dirs() os.mkdir(self._md_dir) os.mkdir(self.private_folder) os.mkdir(self._src_dir) self.change_tracker = ChangeTracker() self.database = Database() self.link_resolver = LinkResolver(self.database) self.database.setup(self.private_folder) self.incremental = False self.sanitized_name = 'test-project-0.1' self.tree = Tree(self, self)
class Project(Configurable): """ Banana banana """ def __init__(self, app, dependency_map=None, page_map=None): self.app = app self.tree = None self.include_paths = None self.extensions = OrderedDict() self.tag_validators = {} self.project_name = None self.project_version = None self.sanitized_name = None self.sitemap_path = None self.subprojects = {} self.extra_asset_folders = OrderedSet() self.extra_assets = {} if dependency_map is None: self.dependency_map = {} else: self.dependency_map = dependency_map if page_map is None: self.page_map = {} else: self.page_map = page_map if os.name == 'nt': self.datadir = os.path.join(os.path.dirname(__file__), '..', 'share') else: self.datadir = "/usr/share" self.formatted_signal = Signal() self.written_out_signal = Signal() self.is_toplevel = False def register_tag_validator(self, validator): """ Banana banana """ self.tag_validators[validator.name] = validator def persist(self): """ Banana banana """ if self.app.dry: return self.tree.persist() for proj in self.subprojects.values(): proj.persist() def finalize(self): """ Banana banana """ self.formatted_signal.clear() # pylint: disable=no-self-use def get_private_folder(self): """ Banana banana """ return self.app.private_folder def setup(self): """ Banana banana """ info('Setting up %s' % self.project_name, 'project') self.app.database.comment_updated_signal.connect( self.__comment_updated_cb) for extension in list(self.extensions.values()): info('Setting up %s' % extension.extension_name) extension.setup() self.app.database.comment_updated_signal.disconnect( self.__comment_updated_cb) sitemap = SitemapParser().parse(self.sitemap_path) self.tree.parse_sitemap(sitemap) self.page_map.update({p: self for p in self.tree.get_pages().values()}) info("Resolving symbols", 'resolution') self.tree.resolve_symbols(self.app.database, self.app.link_resolver) def format(self, link_resolver, output): """ Banana banana """ if not output: return self.tree.format(link_resolver, output, self.extensions) self.formatted_signal(self) @staticmethod def add_arguments(parser): group = parser.add_argument_group('Project', 'project-related options') group.add_argument("--project-name", action="store", dest="project_name", help="Name of the documented project") group.add_argument("--project-version", action="store", dest="project_version", help="Version of the documented project") group.add_argument("-i", "--index", action="store", dest="index", help="location of the " "index file") group.add_argument("--sitemap", action="store", dest="sitemap", help="Location of the sitemap file") group.add_argument('--include-paths', nargs="+", help='paths to look up included files in', dest='include_paths', action='append', default=[]) group.add_argument("--extra-assets", help="Extra asset folders to copy in the output", action='append', dest='extra_assets', default=[]) def add_subproject(self, fname, conf_path): """Creates and adds a new subproject.""" config = Config(conf_file=conf_path) proj = Project(self.app, dependency_map=self.dependency_map, page_map=self.page_map) proj.parse_name_from_config(config) proj.parse_config(config) proj.setup() self.subprojects[fname] = proj def get_page_for_symbol(self, unique_name): """ Banana banana """ return self.dependency_map.get(unique_name) def get_project_for_page(self, page): """ Banana banana """ return self.page_map.get(page) def __create_extensions(self): for ext_class in list(self.app.extension_classes.values()): ext = ext_class(self.app, self) self.extensions[ext.extension_name] = ext def __comment_updated_cb(self, doc_db, comment): self.tree.stale_comment_pages(comment) def parse_name_from_config(self, config): """ Banana banana """ self.project_name = config.get('project_name', None) if not self.project_name: error('invalid-config', 'No project name was provided') self.project_version = config.get('project_version', None) if not self.project_version: error('invalid-config', 'No project version was provided') self.sanitized_name = '%s-%s' % (re.sub( r'\W+', '-', self.project_name), self.project_version) # pylint: disable=arguments-differ def parse_config(self, config, toplevel=False): """Parses @config setting up @self state.""" self.sitemap_path = config.get_path('sitemap') if self.sitemap_path is None: error('invalid-config', 'No sitemap was provided') self.include_paths = OrderedSet([]) index_file = config.get_index() if index_file: if not os.path.exists(index_file): error('invalid-config', 'The provided index "%s" does not exist' % index_file) self.include_paths |= OrderedSet([os.path.dirname(index_file)]) self.include_paths |= OrderedSet(config.get_paths('include_paths')) self.is_toplevel = toplevel self.tree = Tree(self, self.app) self.__create_extensions() for extension in list(self.extensions.values()): if toplevel: extension.parse_toplevel_config(config) extension.parse_config(config) if not toplevel and config.conf_file: self.app.change_tracker.add_hard_dependency(config.conf_file) self.extra_asset_folders = OrderedSet(config.get_paths('extra_assets')) def __add_default_tags(self, _, comment): for validator in list(self.tag_validators.values()): if validator.default and validator.name not in comment.tags: comment.tags[validator.name] = \ Tag(name=validator.name, description=validator.default) def __get_formatter(self, extension_name): """ Banana banana """ ext = self.extensions.get(extension_name) if ext: return ext.formatter return None def write_extra_assets(self, output): for dest, src in self.extra_assets.items(): dest = os.path.join(output, 'html', dest) destdir = os.path.dirname(dest) if not os.path.exists(destdir): os.makedirs(destdir) shutil.copyfile(src, dest) for proj in self.subprojects.values(): proj.write_extra_assets(output) def write_out(self, output): """Banana banana """ ext = self.extensions.get(self.tree.root.extension_name) self.tree.write_out(output) self.write_extra_assets(output) ext.formatter.copy_assets(os.path.join(output, 'html', 'assets')) # Just in case the sitemap root isn't named index ext_folder = ext.formatter.get_output_folder(self.tree.root) ref, _ = self.tree.root.link.get_link(self.app.link_resolver) index_path = os.path.join(ext_folder, ref) default_index_path = os.path.join(output, 'html', 'index.html') if not os.path.exists(default_index_path): with open(default_index_path, 'w', encoding='utf8') as _: _.write('<meta http-equiv="refresh" content="0; url=%s"/>' % index_path) self.written_out_signal(self)
class TestTree(unittest.TestCase): def setUp(self): here = os.path.dirname(__file__) self.__md_dir = os.path.abspath( os.path.join(here, 'tmp-markdown-files')) self.private_folder = os.path.abspath(os.path.join( here, 'tmp-private')) self.__src_dir = os.path.abspath(os.path.join(here, 'tmp-src-files')) self.__output_dir = os.path.abspath(os.path.join(here, 'tmp-output')) self.__remove_tmp_dirs() os.mkdir(self.__md_dir) os.mkdir(self.private_folder) os.mkdir(self.__src_dir) os.mkdir(self.get_generated_doc_folder()) self.include_paths = OrderedSet([self.__md_dir]) self.include_paths.add(self.get_generated_doc_folder()) # Using the real doc database is too costly, tests should be lightning # fast (and they are) self.database = Database() self.database.setup(self.private_folder) self.link_resolver = LinkResolver(self.database) self.change_tracker = ChangeTracker() self.sitemap_parser = SitemapParser() self.project_name = 'test-project' self.sanitized_name = 'test-project-0.1' self.incremental = False self.tree = Tree(self, self) self.test_ext = TestExtension(self, self) self.core_ext = CoreExtension(self, self) cfg = Config() self.test_ext.parse_config(cfg) self.core_ext.parse_config(cfg) self.subprojects = {} self.is_toplevel = True def tearDown(self): self.__remove_tmp_dirs() del self.test_ext del self.core_ext def get_generated_doc_folder(self): return os.path.join(self.private_folder, 'generated') def get_base_doc_folder(self): return self.__md_dir def get_private_folder(self): return self.private_folder def __parse_sitemap(self, text): path = os.path.join(self.__md_dir, 'sitemap.txt') with io.open(path, 'w', encoding='utf-8') as _: _.write(text) return self.sitemap_parser.parse(path) def __create_md_file(self, name, contents): path = os.path.join(self.__md_dir, name) with open(path, 'w') as _: _.write(contents) # Just making sure we don't hit a race condition, # in real world situations it is assumed users # will not update source files twice in the same # microsecond touch(path) def __create_src_file(self, name, symbols): path = os.path.join(self.__md_dir, name) with open(path, 'w') as _: for symbol in symbols: _.write('%s\n' % symbol) # Just making sure we don't hit a race condition, # in real world situations it is assumed users # will not update source files twice in the same # microsecond touch(path) return path def __remove_src_file(self, name): path = os.path.join(self.__md_dir, name) os.unlink(path) def __remove_md_file(self, name): path = os.path.join(self.__md_dir, name) os.unlink(path) def __touch_src_file(self, name): path = os.path.join(self.__md_dir, name) touch(path) def __remove_tmp_dirs(self): shutil.rmtree(self.__md_dir, ignore_errors=True) shutil.rmtree(self.private_folder, ignore_errors=True) shutil.rmtree(self.__src_dir, ignore_errors=True) shutil.rmtree(self.__output_dir, ignore_errors=True) shutil.rmtree(self.get_generated_doc_folder(), ignore_errors=True) def test_basic(self): inp = (u'index.markdown\n' '\tsection.markdown') sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'# My documentation\n')) self.__create_md_file('section.markdown', (u'# My section\n')) self.tree.parse_sitemap(sitemap) pages = self.tree.get_pages() # We do not care about ordering self.assertSetEqual(set(pages.keys()), set([u'index.markdown', u'section.markdown'])) index = pages.get('index.markdown') self.assertEqual(index.title, u'My documentation') def test_basic_incremental(self): inp = (u'index.markdown\n' '\tsection.markdown') sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'# My documentation\n')) self.__create_md_file('section.markdown', (u'# My section\n')) self.tree.parse_sitemap(sitemap) # Building from scratch, all pages are stale self.assertSetEqual(set(self.tree.get_stale_pages()), set([u'index.markdown', u'section.markdown'])) self.tree.persist() self.incremental = True self.tree = Tree(self, self) self.tree.parse_sitemap(sitemap) # Nothing changed, no page is stale self.assertSetEqual(set(self.tree.get_stale_pages()), set({})) # But we still have our pages self.assertSetEqual(set(self.tree.get_pages()), set([u'index.markdown', u'section.markdown'])) touch(os.path.join(self.__md_dir, u'section.markdown')) self.tree = Tree(self, self) self.tree.parse_sitemap(sitemap) self.assertSetEqual(set(self.tree.get_stale_pages()), set([u'section.markdown'])) def __assert_extension_names(self, tree, name_map): pages = tree.get_pages() for name, ext_name in list(name_map.items()): page = pages[name] self.assertEqual(ext_name, page.extension_name) def __assert_stale(self, expected_stale): stale_pages = self.tree.get_stale_pages() for pagename in expected_stale: self.assertIn(pagename, stale_pages) stale_pages.pop(pagename) self.assertEqual(len(stale_pages), 0) def __create_test_layout(self, with_ext_index=True, sitemap=None): if not sitemap: inp = (u'index.markdown\n' '\ttest-index\n' '\t\ttest-section.markdown\n' '\t\t\tsource_a.test\n' '\t\tpage_x.markdown\n' '\t\tpage_y.markdown\n' '\tcore_page.markdown\n') else: inp = sitemap sources = [] sources.append( self.__create_src_file('source_a.test', ['symbol_1', 'symbol_2'])) sources.append( self.__create_src_file('source_b.test', ['symbol_3', 'symbol_4'])) if with_ext_index: self.test_ext.index = 'test-index.markdown' self.test_ext.sources = sources self.test_ext.setup() sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'# My documentation\n')) self.__create_md_file('core_page.markdown', (u'# My non-extension page\n')) if with_ext_index: self.__create_md_file('test-index.markdown', (u'# My test index\n')) self.__create_md_file( 'test-section.markdown', (u'# My test section\n' '\n' 'Linking to [a generated page](source_a.test)\n')) self.__create_md_file('page_x.markdown', (u'---\n' 'symbols: [symbol_3]\n' '...\n' '# Page X\n')) self.__create_md_file('page_y.markdown', (u'# Page Y\n')) self.tree.parse_sitemap(sitemap) return sitemap def __update_test_layout(self, sitemap): self.test_ext.reset() self.tree = Tree(self, self) self.test_ext.setup() self.tree.parse_sitemap(sitemap) def test_extension_basic(self): _ = self.__create_test_layout() self.__assert_extension_names( self.tree, { u'index.markdown': 'core', u'test-index': 'test-extension', u'test-section.markdown': 'test-extension', u'source_a.test': 'test-extension', u'source_b.test': 'test-extension', u'page_x.markdown': 'test-extension', u'page_y.markdown': 'test-extension', u'core_page.markdown': 'core' }) all_pages = self.tree.get_pages() self.assertEqual(len(all_pages), 8) self.__assert_stale(all_pages) self.assertNotIn('source_a.test', all_pages['test-index'].subpages) self.assertIn('source_a.test', all_pages['test-section.markdown'].subpages) def test_extension_override(self): self.__create_md_file('source_a.test.markdown', (u'# My override\n')) _ = self.__create_test_layout() page = self.tree.get_pages()['source_a.test'] self.assertEqual(page.symbol_names, OrderedSet(['symbol_1', 'symbol_2'])) self.assertEqual(os.path.basename(page.source_file), 'source_a.test.markdown') out, _ = cmark.ast_to_html(page.ast, None) self.assertEqual(out, u'<h1>My override</h1>\n') def test_no_extension_index_override(self): _ = self.__create_test_layout(with_ext_index=False) ext_index = self.tree.get_pages()['test-index'] self.assertEqual(ext_index.generated, True) self.assertEqual(len(ext_index.subpages), 4) def test_parse_yaml(self): inp = (u'index.markdown\n') sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'---\n' 'title: A random title\n' 'symbols: [symbol_1, symbol_2]\n' '...\n' '# My documentation\n')) self.tree.parse_sitemap(sitemap) pages = self.tree.get_pages() page = pages.get('index.markdown') out, _ = cmark.ast_to_html(page.ast, None) self.assertEqual(out, u'<h1>My documentation</h1>\n') self.assertEqual(page.title, u'A random title') self.assertEqual(page.symbol_names, OrderedSet(['symbol_1', 'symbol_2'])) def test_empty_link_resolution(self): inp = (u'index.markdown\n' '\tsection.markdown') sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'# My documentation\n')) self.__create_md_file('section.markdown', (u'# My section\n' '\n' '[](index.markdown)\n')) self.tree.parse_sitemap(sitemap) self.tree.resolve_symbols(self.database, self.link_resolver) self.tree.format(self.link_resolver, self.__output_dir, {self.core_ext.extension_name: self.core_ext}) pages = self.tree.get_pages() page = pages.get('section.markdown') self.assertEqual( page.formatted_contents, u'<h1>My section</h1>\n' '<p><a href="index.html">My documentation</a></p>\n') def test_labeled_link_resolution(self): inp = (u'index.markdown\n' '\tsection.markdown') sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'# My documentation\n')) self.__create_md_file('section.markdown', (u'# My section\n' '\n' '[a label](index.markdown)\n')) self.tree.parse_sitemap(sitemap) self.tree.resolve_symbols(self.database, self.link_resolver) self.tree.format(self.link_resolver, self.__output_dir, {self.core_ext.extension_name: self.core_ext}) pages = self.tree.get_pages() page = pages.get('section.markdown') self.assertEqual( page.formatted_contents, u'<h1>My section</h1>\n' '<p><a href="index.html">a label</a></p>\n') def test_anchored_link_resolution(self): inp = (u'index.markdown\n' '\tsection.markdown') sitemap = self.__parse_sitemap(inp) self.__create_md_file('index.markdown', (u'# My documentation\n')) self.__create_md_file('section.markdown', (u'# My section\n' '\n' '[](index.markdown#subsection)\n')) self.tree.parse_sitemap(sitemap) self.tree.resolve_symbols(self.database, self.link_resolver) self.tree.format(self.link_resolver, self.__output_dir, {self.core_ext.extension_name: self.core_ext}) pages = self.tree.get_pages() page = pages.get('section.markdown') self.assertEqual( page.formatted_contents, u'<h1>My section</h1>\n' '<p><a href="index.html#subsection">My documentation</a></p>\n') # pylint: disable=too-many-statements def test_extension_incremental(self): sitemap = self.__create_test_layout() self.tree.persist() self.incremental = True # Here we touch source_a.test, as its symbols were # all contained in a generated page, only that page # should now be stale self.__touch_src_file('source_a.test') self.__update_test_layout(sitemap) self.__assert_stale(set(['source_a.test'])) self.tree.persist() # We now touch source_b.test, which symbols are contained # both in a generated page and a user-provided one. # We expect both pages to be stale self.__touch_src_file('source_b.test') self.__update_test_layout(sitemap) self.__assert_stale(set(['source_b.test', 'page_x.markdown'])) self.tree.persist() # This one is trickier: we unlist symbol_3 from # page_x, which means the symbol should now be # documented in the generated page for source_b.test. # We expect both pages to be stale, and make sure # they contain the right symbols self.__create_md_file('page_x.markdown', (u'# Page X\n')) self.__update_test_layout(sitemap) self.__assert_stale(set(['source_b.test', 'page_x.markdown'])) page_x = self.tree.get_pages()['page_x.markdown'] self.assertEqual(page_x.symbol_names, OrderedSet()) source_b_page = self.tree.get_pages()['source_b.test'] self.assertEqual(source_b_page.symbol_names, OrderedSet(['symbol_4', 'symbol_3'])) self.tree.persist() # Let's make sure the opposite use case works as well, # we relocate symbol_3 in page_x , both page_x and # the generated page for source_b.test should be stale # and the symbols should be back to their original # layout. self.__create_md_file('page_x.markdown', (u'---\n' 'symbols: [symbol_3]\n' '...\n' '# Page X\n')) self.__update_test_layout(sitemap) self.__assert_stale(set(['source_b.test', 'page_x.markdown'])) page_x = self.tree.get_pages()['page_x.markdown'] self.assertEqual(page_x.symbol_names, OrderedSet(['symbol_3'])) source_b_page = self.tree.get_pages()['source_b.test'] self.assertEqual(source_b_page.symbol_names, OrderedSet(['symbol_4'])) self.tree.persist() # We now move the definition of symbol_3 to source_a.test, # we thus expect the generated page for source_a.test to be # stale because its source changed, same for source_b.test, # and page_x.markdown should be stale as well because the # definition of symbol_3 may have changed. The final # symbol layout should not have changed however. self.__create_src_file('source_a.test', ['symbol_1', 'symbol_2', 'symbol_3']) self.__create_src_file('source_b.test', ['symbol_4']) self.__update_test_layout(sitemap) self.__assert_stale( set(['source_a.test', 'source_b.test', 'page_x.markdown'])) page_x = self.tree.get_pages()['page_x.markdown'] self.assertEqual(page_x.symbol_names, OrderedSet(['symbol_3'])) source_b_page = self.tree.get_pages()['source_b.test'] self.assertEqual(source_b_page.symbol_names, OrderedSet(['symbol_4'])) source_a_page = self.tree.get_pages()['source_a.test'] self.assertEqual(source_a_page.symbol_names, OrderedSet(['symbol_1', 'symbol_2'])) self.tree.persist() # And we rollback again self.__create_src_file('source_a.test', ['symbol_1', 'symbol_2']) self.__create_src_file('source_b.test', ['symbol_3', 'symbol_4']) self.__update_test_layout(sitemap) self.__assert_stale( set(['source_a.test', 'source_b.test', 'page_x.markdown'])) page_x = self.tree.get_pages()['page_x.markdown'] self.assertEqual(page_x.symbol_names, OrderedSet(['symbol_3'])) source_b_page = self.tree.get_pages()['source_b.test'] self.assertEqual(source_b_page.symbol_names, OrderedSet(['symbol_4'])) source_a_page = self.tree.get_pages()['source_a.test'] self.assertEqual(source_a_page.symbol_names, OrderedSet(['symbol_1', 'symbol_2'])) self.tree.persist() # Now we'll try removing page_x altogether self.__remove_md_file('page_x.markdown') inp = (u'index.markdown\n' '\ttest-index\n' '\t\ttest-section.markdown\n' '\t\t\tsource_a.test\n' '\t\tpage_y.markdown\n' '\tcore_page.markdown\n') new_sitemap = self.__parse_sitemap(inp) self.__update_test_layout(new_sitemap) self.__assert_stale(set(['source_b.test'])) source_b_page = self.tree.get_pages()['source_b.test'] self.assertEqual(source_b_page.symbol_names, OrderedSet(['symbol_4', 'symbol_3'])) self.tree.persist() # And rollback again self.__create_md_file('page_x.markdown', (u'---\n' 'symbols: [symbol_3]\n' '...\n' '# Page X\n')) self.__update_test_layout(sitemap) self.__assert_stale(set(['page_x.markdown', 'source_b.test'])) page_x = self.tree.get_pages()['page_x.markdown'] self.assertEqual(page_x.symbol_names, OrderedSet(['symbol_3'])) source_b_page = self.tree.get_pages()['source_b.test'] self.assertEqual(source_b_page.symbol_names, OrderedSet(['symbol_4'])) self.tree.persist() def test_index_override_incremental(self): sitemap = self.__create_test_layout() self.tree.persist() index_page = self.tree.get_pages()['test-index'] self.assertIn('source_b.test', index_page.subpages) self.incremental = True self.__touch_src_file('test-index.markdown') self.__update_test_layout(sitemap) index_page = self.tree.get_pages()['test-index'] self.assertIn('source_b.test', index_page.subpages) self.tree.persist() def test_extension_index_only(self): inp = (u'test-index\n' '\ttest-section.markdown\n') self.test_ext.setup() sitemap = self.__parse_sitemap(inp) self.__create_md_file('test-section.markdown', u'# My test section\n') self.tree.parse_sitemap(sitemap) self.__assert_extension_names( self.tree, { u'test-index': 'test-extension', u'test-section.markdown': 'test-extension' }) def test_extension_auto_sorted_override(self): self.__create_md_file('source_b.test.markdown', (u'---\nauto-sort: true\n...\n# My override\n')) sitemap = (u'index.markdown\n' '\ttest-index\n' '\t\ttest-section.markdown\n' '\t\t\tsource_b.test\n' '\t\t\tsource_a.test\n' '\t\tpage_x.markdown\n' '\t\tpage_y.markdown\n' '\tcore_page.markdown\n') _ = self.__create_test_layout(sitemap=sitemap) pages = self.tree.get_pages() self.assertTrue(pages['source_a.test'].pre_sorted) self.assertFalse(pages['source_b.test'].pre_sorted) self.__create_md_file('source_b.test.markdown', (u'# My override\n')) sitemap = (u'index.markdown\n' '\ttest-index\n' '\t\ttest-section.markdown\n' '\t\t\tsource_b.test\n' '\t\t\tsource_a.test\n' '\t\tpage_x.markdown\n' '\t\tpage_y.markdown\n' '\tcore_page.markdown\n') _ = self.__create_test_layout(sitemap=sitemap) pages = self.tree.get_pages() self.assertTrue(pages['source_a.test'].pre_sorted) self.assertTrue(pages['source_b.test'].pre_sorted) def test_extension_implicit_override(self): self.__create_md_file( 'source_b.test.markdown', (u'---\nsymbols:\n - symbol_2\n...\n# My override\n')) _ = self.__create_test_layout() source_b = self.tree.get_pages()['source_b.test'] self.assertEqual(os.path.basename(source_b.source_file), 'source_b.test.markdown') self.assertEqual(source_b.symbol_names, ['symbol_2', 'symbol_4']) source_a = self.tree.get_pages()['source_a.test'] self.assertEqual(source_a.symbol_names, ['symbol_1']) out, _ = cmark.ast_to_html(source_b.ast, None) self.assertEqual(out, u'<h1>My override</h1>\n')
def __update_test_layout(self, sitemap): self.test_ext.reset() self.tree = Tree(self, self) self.test_ext.setup() self.tree.parse_sitemap(sitemap)