def GetReferenceResolver(self, platform): if self._platform_data[platform].reference_resolver is None: self._platform_data[platform].reference_resolver = ReferenceResolver( self.GetAPIModels(platform), self._object_store_creator.Create(ReferenceResolver, category=platform)) return self._platform_data[platform].reference_resolver
def _CreateTemplateDataSource(self, compiled_fs_factory, api_data=None): if api_data is None: api_data_factory = APIDataSource.Factory(compiled_fs_factory, 'fake_path', _FakeFactory()) else: api_data_factory = _FakeFactory(api_data) reference_resolver_factory = ReferenceResolver.Factory( api_data_factory, self._fake_api_list_data_source_factory, ObjectStoreCreator.ForTest()) @DisableLogging('error') # "was never set" error def create_from_factory(factory): path = 'extensions/foo' return factory.Create(Request.ForTest(path), path) return create_from_factory(TemplateDataSource.Factory( api_data_factory, self._fake_api_list_data_source_factory, self._fake_intro_data_source_factory, self._fake_samples_data_source_factory, self._fake_sidenav_data_source_factory, compiled_fs_factory, reference_resolver_factory, self._manifest_data_source, '.', '.', ''))
def __init__(self, channel, object_store_creator_factory, svn_file_system, github_file_system): self.svn_file_system = svn_file_system self.github_file_system = github_file_system self.compiled_fs_factory = CompiledFileSystem.Factory( svn_file_system, object_store_creator_factory) self.api_list_data_source_factory = APIListDataSource.Factory( self.compiled_fs_factory, svn_constants.API_PATH, svn_constants.PUBLIC_TEMPLATE_PATH) self.api_data_source_factory = APIDataSource.Factory( self.compiled_fs_factory, svn_constants.API_PATH) self.ref_resolver_factory = ReferenceResolver.Factory( self.api_data_source_factory, self.api_list_data_source_factory, object_store_creator_factory) self.api_data_source_factory.SetReferenceResolverFactory( self.ref_resolver_factory) # Note: samples are super slow in the dev server because it doesn't support # async fetch, so disable them. If you actually want to test samples, then # good luck, and modify _IsSamplesDisabled at the top. if _IsSamplesDisabled(): svn_fs_for_samples = EmptyDirFileSystem() else: svn_fs_for_samples = self.svn_file_system self.samples_data_source_factory = SamplesDataSource.Factory( channel, svn_fs_for_samples, self.github_file_system, self.ref_resolver_factory, object_store_creator_factory, svn_constants.EXAMPLES_PATH) self.api_data_source_factory.SetSamplesDataSourceFactory( self.samples_data_source_factory) self.intro_data_source_factory = IntroDataSource.Factory( self.compiled_fs_factory, self.ref_resolver_factory, [svn_constants.INTRO_PATH, svn_constants.ARTICLE_PATH]) self.sidenav_data_source_factory = SidenavDataSource.Factory( self.compiled_fs_factory, svn_constants.JSON_PATH) self.template_data_source_factory = TemplateDataSource.Factory( channel, self.api_data_source_factory, self.api_list_data_source_factory, self.intro_data_source_factory, self.samples_data_source_factory, self.sidenav_data_source_factory, self.compiled_fs_factory, self.ref_resolver_factory, svn_constants.PUBLIC_TEMPLATE_PATH, svn_constants.PRIVATE_TEMPLATE_PATH) self.example_zipper = ExampleZipper(self.compiled_fs_factory, svn_constants.DOCS_PATH) self.path_canonicalizer = PathCanonicalizer(channel, self.compiled_fs_factory) self.content_cache = self.compiled_fs_factory.GetOrCreateIdentity()
def __init__(self, channel, object_store_creator_factory, svn_file_system, github_file_system): self.svn_file_system = svn_file_system self.github_file_system = github_file_system self.compiled_fs_factory = CompiledFileSystem.Factory( svn_file_system, object_store_creator_factory) self.api_list_data_source_factory = APIListDataSource.Factory( self.compiled_fs_factory, svn_constants.API_PATH, svn_constants.PUBLIC_TEMPLATE_PATH) self.api_data_source_factory = APIDataSource.Factory( self.compiled_fs_factory, svn_constants.API_PATH) self.ref_resolver_factory = ReferenceResolver.Factory( self.api_data_source_factory, self.api_list_data_source_factory, object_store_creator_factory) self.api_data_source_factory.SetReferenceResolverFactory( self.ref_resolver_factory) self.samples_data_source_factory = SamplesDataSource.Factory( channel, self.svn_file_system, ServerInstance.github_file_system, self.ref_resolver_factory, object_store_creator_factory, svn_constants.EXAMPLES_PATH) self.api_data_source_factory.SetSamplesDataSourceFactory( self.samples_data_source_factory) self.intro_data_source_factory = IntroDataSource.Factory( self.compiled_fs_factory, self.ref_resolver_factory, [svn_constants.INTRO_PATH, svn_constants.ARTICLE_PATH]) self.sidenav_data_source_factory = SidenavDataSource.Factory( self.compiled_fs_factory, svn_constants.JSON_PATH) self.template_data_source_factory = TemplateDataSource.Factory( channel, self.api_data_source_factory, self.api_list_data_source_factory, self.intro_data_source_factory, self.samples_data_source_factory, self.sidenav_data_source_factory, self.compiled_fs_factory, self.ref_resolver_factory, svn_constants.PUBLIC_TEMPLATE_PATH, svn_constants.PRIVATE_TEMPLATE_PATH) self.example_zipper = ExampleZipper(self.compiled_fs_factory, svn_constants.DOCS_PATH) self.path_canonicalizer = PathCanonicalizer(channel, self.compiled_fs_factory) self.content_cache = self.compiled_fs_factory.GetOrCreateIdentity()
def _CreateTemplateDataSource(self, compiled_fs_factory, api_data=None): if api_data is None: api_data_factory = APIDataSource.Factory(compiled_fs_factory, 'fake_path') else: api_data_factory = _FakeFactory(api_data) reference_resolver_factory = ReferenceResolver.Factory( api_data_factory, self._fake_api_list_data_source_factory, ObjectStoreCreator.Factory()) return (TemplateDataSource.Factory( 'fake_channel', api_data_factory, self._fake_api_list_data_source_factory, self._fake_intro_data_source_factory, self._fake_samples_data_source_factory, self._fake_sidenav_data_source_factory, compiled_fs_factory, reference_resolver_factory, '.', '.').Create(_FakeRequest(), 'extensions/foo'))
def _GetInstanceForBranch(channel_name, local_path): branch = BRANCH_UTILITY.GetBranchNumberForChannelName(channel_name) # The key for the server is a tuple of |channel_name| with |branch|, since # sometimes stable and beta point to the same branch. instance_key = _MakeInstanceKey(channel_name, branch) instance = SERVER_INSTANCES.get(instance_key, None) if instance is not None: return instance branch_memcache = InMemoryObjectStore(branch) if branch == 'local': file_system = LocalFileSystem(local_path) else: file_system = _CreateMemcacheFileSystem(branch, branch_memcache) cache_factory = CompiledFileSystem.Factory(file_system, branch_memcache) api_list_data_source_factory = APIListDataSource.Factory( cache_factory, file_system, API_PATH, PUBLIC_TEMPLATE_PATH) intro_data_source_factory = IntroDataSource.Factory( cache_factory, [INTRO_PATH, ARTICLE_PATH]) api_data_source_factory = APIDataSource.Factory(cache_factory, API_PATH) # Give the ReferenceResolver a memcache, to speed up the lookup of # duplicate $refs. ref_resolver_factory = ReferenceResolver.Factory( api_data_source_factory, api_list_data_source_factory, branch_memcache) api_data_source_factory.SetReferenceResolverFactory(ref_resolver_factory) samples_data_source_factory = SamplesDataSource.Factory( channel_name, file_system, GITHUB_FILE_SYSTEM, cache_factory, GITHUB_COMPILED_FILE_SYSTEM, ref_resolver_factory, EXAMPLES_PATH) api_data_source_factory.SetSamplesDataSourceFactory( samples_data_source_factory) sidenav_data_source_factory = SidenavDataSource.Factory( cache_factory, JSON_PATH) template_data_source_factory = TemplateDataSource.Factory( channel_name, api_data_source_factory, api_list_data_source_factory, intro_data_source_factory, samples_data_source_factory, KNOWN_ISSUES_DATA_SOURCE, sidenav_data_source_factory, cache_factory, PUBLIC_TEMPLATE_PATH, PRIVATE_TEMPLATE_PATH) example_zipper = ExampleZipper(file_system, cache_factory, DOCS_PATH) instance = ServerInstance(template_data_source_factory, example_zipper, cache_factory) SERVER_INSTANCES[instance_key] = instance return instance
def __init__(self, channel, object_store_creator, host_file_system, app_samples_file_system, base_path, compiled_fs_factory): self.channel = channel self.object_store_creator = object_store_creator self.host_file_system = host_file_system self.app_samples_file_system = app_samples_file_system self.compiled_host_fs_factory = compiled_fs_factory self.api_list_data_source_factory = APIListDataSource.Factory( self.compiled_host_fs_factory, svn_constants.API_PATH, svn_constants.PUBLIC_TEMPLATE_PATH) self.api_data_source_factory = APIDataSource.Factory( self.compiled_host_fs_factory, svn_constants.API_PATH) self.ref_resolver_factory = ReferenceResolver.Factory( self.api_data_source_factory, self.api_list_data_source_factory, object_store_creator) self.api_data_source_factory.SetReferenceResolverFactory( self.ref_resolver_factory) # Note: samples are super slow in the dev server because it doesn't support # async fetch, so disable them. if IsDevServer(): extension_samples_fs = EmptyDirFileSystem() else: extension_samples_fs = self.host_file_system self.samples_data_source_factory = SamplesDataSource.Factory( channel, extension_samples_fs, CompiledFileSystem.Factory(extension_samples_fs, object_store_creator), self.app_samples_file_system, CompiledFileSystem.Factory(self.app_samples_file_system, object_store_creator), self.ref_resolver_factory, svn_constants.EXAMPLES_PATH) self.api_data_source_factory.SetSamplesDataSourceFactory( self.samples_data_source_factory) self.intro_data_source_factory = IntroDataSource.Factory( self.compiled_host_fs_factory, self.ref_resolver_factory, [svn_constants.INTRO_PATH, svn_constants.ARTICLE_PATH]) self.sidenav_data_source_factory = SidenavDataSource.Factory( self.compiled_host_fs_factory, svn_constants.JSON_PATH, base_path) self.template_data_source_factory = TemplateDataSource.Factory( channel, self.api_data_source_factory, self.api_list_data_source_factory, self.intro_data_source_factory, self.samples_data_source_factory, self.sidenav_data_source_factory, self.compiled_host_fs_factory, self.ref_resolver_factory, svn_constants.PUBLIC_TEMPLATE_PATH, svn_constants.PRIVATE_TEMPLATE_PATH, base_path) self.example_zipper = ExampleZipper(self.compiled_host_fs_factory, svn_constants.DOCS_PATH) self.path_canonicalizer = PathCanonicalizer( channel, self.compiled_host_fs_factory) self.content_cache = self.compiled_host_fs_factory.CreateIdentity( ServerInstance)
def _CreateRefResolver(self, filename): test_data = self._LoadJSON(filename) return ReferenceResolver.Factory( _FakeAPIDataSource(test_data), _FakeAPIModels(test_data), ObjectStoreCreator.ForTest()).Create()
def __init__(self, object_store_creator, host_file_system, app_samples_file_system, base_path, compiled_fs_factory, branch_utility, host_file_system_creator): self.object_store_creator = object_store_creator self.host_file_system = host_file_system self.app_samples_file_system = app_samples_file_system self.compiled_host_fs_factory = compiled_fs_factory self.host_file_system_creator = host_file_system_creator self.availability_finder_factory = AvailabilityFinder.Factory( object_store_creator, self.compiled_host_fs_factory, branch_utility, host_file_system_creator) self.api_list_data_source_factory = APIListDataSource.Factory( self.compiled_host_fs_factory, self.host_file_system, svn_constants.API_PATH, svn_constants.PUBLIC_TEMPLATE_PATH) self.api_data_source_factory = APIDataSource.Factory( self.compiled_host_fs_factory, svn_constants.API_PATH, self.availability_finder_factory) self.ref_resolver_factory = ReferenceResolver.Factory( self.api_data_source_factory, self.api_list_data_source_factory, object_store_creator) self.api_data_source_factory.SetReferenceResolverFactory( self.ref_resolver_factory) # Note: samples are super slow in the dev server because it doesn't support # async fetch, so disable them. if IsDevServer(): extension_samples_fs = EmptyDirFileSystem() else: extension_samples_fs = self.host_file_system self.samples_data_source_factory = SamplesDataSource.Factory( extension_samples_fs, CompiledFileSystem.Factory(extension_samples_fs, object_store_creator), self.app_samples_file_system, CompiledFileSystem.Factory(self.app_samples_file_system, object_store_creator), self.ref_resolver_factory, svn_constants.EXAMPLES_PATH, base_path) self.api_data_source_factory.SetSamplesDataSourceFactory( self.samples_data_source_factory) self.intro_data_source_factory = IntroDataSource.Factory( self.compiled_host_fs_factory, self.ref_resolver_factory, [svn_constants.INTRO_PATH, svn_constants.ARTICLE_PATH]) self.sidenav_data_source_factory = SidenavDataSource.Factory( self.compiled_host_fs_factory, svn_constants.JSON_PATH) self.manifest_data_source = ManifestDataSource( self.compiled_host_fs_factory, host_file_system, '/'.join( (svn_constants.JSON_PATH, 'manifest.json')), '/'.join( (svn_constants.API_PATH, '_manifest_features.json'))) self.template_data_source_factory = TemplateDataSource.Factory( self.api_data_source_factory, self.api_list_data_source_factory, self.intro_data_source_factory, self.samples_data_source_factory, self.sidenav_data_source_factory, self.compiled_host_fs_factory, self.ref_resolver_factory, self.manifest_data_source, svn_constants.PUBLIC_TEMPLATE_PATH, svn_constants.PRIVATE_TEMPLATE_PATH, base_path) self.api_data_source_factory.SetTemplateDataSource( self.template_data_source_factory) self.example_zipper = ExampleZipper(self.compiled_host_fs_factory, self.host_file_system, svn_constants.DOCS_PATH) self.path_canonicalizer = PathCanonicalizer( self.compiled_host_fs_factory) self.redirector = Redirector(self.compiled_host_fs_factory, self.host_file_system, svn_constants.PUBLIC_TEMPLATE_PATH)
def testGetLink(self): test_data = json.loads(self._ReadLocalFile('fake_data_source.json')) resolver = ReferenceResolver(_FakeAPIDataSource(test_data), _FakeAPIModels(test_data.keys()), TestObjectStore('test')) self.assertEqual({ 'href': 'foo', 'text': 'foo', 'name': 'foo' }, resolver.GetLink('foo', namespace='baz')) self.assertEqual({ 'href': 'foo#type-foo_t1', 'text': 'foo.foo_t1', 'name': 'foo_t1' }, resolver.GetLink('foo.foo_t1', namespace='baz')) self.assertEqual({ 'href': 'baz#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz.baz_e1', namespace='baz')) self.assertEqual({ 'href': 'baz#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz_e1', namespace='baz')) self.assertEqual({ 'href': 'foo#method-foo_f1', 'text': 'foo.foo_f1', 'name': 'foo_f1' }, resolver.GetLink('foo.foo_f1', namespace='baz')) self.assertEqual({ 'href': 'foo#property-foo_p3', 'text': 'foo.foo_p3', 'name': 'foo_p3' }, resolver.GetLink('foo.foo_p3', namespace='baz')) self.assertEqual({ 'href': 'bar.bon#type-bar_bon_t3', 'text': 'bar.bon.bar_bon_t3', 'name': 'bar_bon_t3' }, resolver.GetLink('bar.bon.bar_bon_t3', namespace='baz')) self.assertEqual({ 'href': 'bar.bon#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar_bon_p3', namespace='bar.bon')) self.assertEqual({ 'href': 'bar.bon#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar.bon.bar_bon_p3', namespace='bar.bon')) self.assertEqual({ 'href': 'bar#event-bar_e2', 'text': 'bar_e2', 'name': 'bar_e2' }, resolver.GetLink('bar.bar_e2', namespace='bar')) self.assertEqual({ 'href': 'bar#type-bon', 'text': 'bon', 'name': 'bon' }, resolver.GetLink('bar.bon', namespace='bar')) self.assertEqual({ 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual({ 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual({ 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_p1.foo_t3_e1', namespace='foo')) self.assertEqual({ 'href': 'bar#property-bar_t1-bar_t1_p1', 'text': 'bar.bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo')) self.assertEqual({ 'href': 'bar#property-bar_t1-bar_t1_p1', 'text': 'bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar_p3.bar_t1_p1', namespace='bar')) self.assertEqual( None, resolver.GetLink('bar.bar_p3.bar_t2_p1', namespace='bar')) self.assertEqual( None, resolver.GetLink('bar.bon.bar_e3', namespace='bar')) self.assertEqual( None, resolver.GetLink('bar_p3', namespace='baz.bon')) self.assertEqual( None, resolver.GetLink('falafel.faf', namespace='a')) self.assertEqual( None, resolver.GetLink('bar_p3', namespace='foo')) self.assertEqual( 'Hello <a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="bar.bon#property-bar_bon_p3">Bon Bon</a>, ' '<a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hello $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', namespace='bar.bon')) self.assertEqual( 'I like <a href="bar#property-bar_t1-bar_t1_p1">food</a>.', resolver.ResolveAllLinks('I like $ref:[bar.bar_p3.bar_t1_p1 food].', namespace='foo')) self.assertEqual( 'Ref <a href="foo">It\'s foo!</a>', resolver.ResolveAllLinks('Ref $ref:[foo It\'s foo!]', namespace='bar')) self.assertEqual( 'Ref <a href="bar#type-bon">Bon</a>', resolver.ResolveAllLinks('Ref $ref:[bar.bon Bon]', namespace='bar')) # Different kinds of whitespace can be significant inside <pre> tags. self.assertEqual( '<pre><a href="bar#type-bon">bar.bon</a>({\nkey: value})', resolver.ResolveAllLinks('<pre>$ref:[bar.bon]({\nkey: value})', namespace='baz')) # Allow bare "$ref:foo.bar." at the end of a string. self.assertEqual( '<a href="bar#type-bon">bar.bon</a>.', resolver.ResolveAllLinks('$ref:bar.bon.', namespace='baz')) # If a request is provided it should construct an appropriate relative link. self.assertEqual( 'Hi <a href="../../bar.bon#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="../../bar.bon#property-bar_bon_p3">Bon Bon</a>, ' '<a href="../../bar.bon#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', relative_to='big/long/path/bar.html', namespace='bar.bon')) self.assertEqual( 'Hi <a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="bar.bon#property-bar_bon_p3">Bon Bon</a>, ' '<a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', relative_to='', namespace='bar.bon')) self.assertEqual( 'Hi <a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="bar.bon#property-bar_bon_p3">Bon Bon</a>, ' '<a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', relative_to='bar.html', namespace='bar.bon')) self.assertEqual( 'Hi <a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="bar.bon#property-bar_bon_p3">Bon Bon</a>, ' '<a href="bar.bon#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', relative_to='foo/bar.html', namespace='bar.bon')) self.assertEqual( 'Hi <a href="../bar.bon#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="../bar.bon#property-bar_bon_p3">Bon Bon</a>, ' '<a href="../bar.bon#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', relative_to='foo/baz/bar.html', namespace='bar.bon'))
def __init__(self, object_store_creator, compiled_fs_factory, branch_utility, host_file_system_provider, github_file_system_provider, gcs_file_system_provider, base_path='/'): ''' |object_store_creator| The ObjectStoreCreator used to create almost all caches. |compiled_fs_factory| Factory used to create CompiledFileSystems, a higher-level cache type than ObjectStores. This can usually be derived from just |object_store_creator| but under special circumstances a different implementation needs to be passed in. |branch_utility| Has knowledge of Chrome branches, channels, and versions. |host_file_system_provider| Creates FileSystem instances which host the server at alternative revisions. |github_file_system_provider| Creates FileSystem instances backed by GitHub. |base_path| The path which all HTML is generated relative to. Usually this is / but some servlets need to override this. ''' self.object_store_creator = object_store_creator self.compiled_fs_factory = compiled_fs_factory self.host_file_system_provider = host_file_system_provider host_fs_at_trunk = host_file_system_provider.GetTrunk() self.github_file_system_provider = github_file_system_provider self.gcs_file_system_provider = gcs_file_system_provider assert base_path.startswith('/') and base_path.endswith('/') self.base_path = base_path self.host_file_system_iterator = HostFileSystemIterator( host_file_system_provider, branch_utility) self.features_bundle = FeaturesBundle( host_fs_at_trunk, self.compiled_fs_factory, self.object_store_creator) self.api_models = APIModels( self.features_bundle, self.compiled_fs_factory, host_fs_at_trunk) self.availability_finder = AvailabilityFinder( branch_utility, compiled_fs_factory, self.host_file_system_iterator, host_fs_at_trunk, object_store_creator) self.api_categorizer = APICategorizer( host_fs_at_trunk, compiled_fs_factory) self.api_data_source_factory = APIDataSource.Factory( self.compiled_fs_factory, host_fs_at_trunk, self.availability_finder, self.api_models, self.features_bundle, self.object_store_creator) self.ref_resolver_factory = ReferenceResolver.Factory( self.api_data_source_factory, self.api_models, object_store_creator) self.api_data_source_factory.SetReferenceResolverFactory( self.ref_resolver_factory) # Note: samples are super slow in the dev server because it doesn't support # async fetch, so disable them. if IsDevServer(): extension_samples_fs = EmptyDirFileSystem() app_samples_fs = EmptyDirFileSystem() else: extension_samples_fs = host_fs_at_trunk # TODO(kalman): Re-enable the apps samples, see http://crbug.com/344097. app_samples_fs = EmptyDirFileSystem() #app_samples_fs = github_file_system_provider.Create( # 'GoogleChrome', 'chrome-app-samples') self.samples_data_source_factory = SamplesDataSource.Factory( extension_samples_fs, app_samples_fs, CompiledFileSystem.Factory(object_store_creator), self.ref_resolver_factory, base_path) self.api_data_source_factory.SetSamplesDataSourceFactory( self.samples_data_source_factory) self.content_providers = ContentProviders( object_store_creator, self.compiled_fs_factory, host_fs_at_trunk, self.github_file_system_provider, self.gcs_file_system_provider) # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry, # then factor out the DataSource creation into a factory method, so that # the entire ServerInstance doesn't need to be passed in here. self.template_renderer = TemplateRenderer(self) # TODO(kalman): It may be better for |document_renderer| to construct a # TemplateDataSource itself rather than depending on template_renderer, but # for that the above todo should be addressed. self.document_renderer = DocumentRenderer( TableOfContentsRenderer(host_fs_at_trunk, compiled_fs_factory, self.template_renderer), self.ref_resolver_factory.Create())
def testGetLink(self): data_source = FakeAPIDataSource( json.loads(self._ReadLocalFile('fake_data_source.json'))) resolver = ReferenceResolver(data_source, data_source, InMemoryObjectStore('')) self.assertEqual({ 'href': 'foo.html#type-foo_t1', 'text': 'foo.foo_t1' }, resolver.GetLink('baz', 'foo.foo_t1')) self.assertEqual({ 'href': 'baz.html#event-baz_e1', 'text': 'baz_e1' }, resolver.GetLink('baz', 'baz.baz_e1')) self.assertEqual({ 'href': '#event-baz_e1', 'text': 'baz_e1' }, resolver.GetLink('baz', 'baz_e1')) self.assertEqual({ 'href': 'foo.html#method-foo_f1', 'text': 'foo.foo_f1' }, resolver.GetLink('baz', 'foo.foo_f1')) self.assertEqual({ 'href': 'foo.html#property-foo_p3', 'text': 'foo.foo_p3' }, resolver.GetLink('baz', 'foo.foo_p3')) self.assertEqual({ 'href': 'bar.bon.html#type-bar_bon_t3', 'text': 'bar.bon.bar_bon_t3' }, resolver.GetLink('baz', 'bar.bon.bar_bon_t3')) self.assertEqual({ 'href': '#property-bar_bon_p3', 'text': 'bar_bon_p3' }, resolver.GetLink('bar.bon', 'bar_bon_p3')) self.assertEqual({ 'href': 'bar.bon.html#property-bar_bon_p3', 'text': 'bar_bon_p3' }, resolver.GetLink('bar.bon', 'bar.bon.bar_bon_p3')) self.assertEqual({ 'href': 'bar.html#event-bar_e2', 'text': 'bar_e2' }, resolver.GetLink('bar', 'bar.bar_e2')) self.assertEqual({ 'href': 'bar.html#type-bon', 'text': 'bon' }, resolver.GetLink('bar', 'bar.bon')) self.assertEqual({ 'href': '#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1' }, resolver.GetLink('foo', 'foo_t3.foo_t3_e1')) self.assertEqual({ 'href': 'foo.html#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1' }, resolver.GetLink('foo', 'foo.foo_t3.foo_t3_e1')) self.assertEqual( None, resolver.GetLink('bar', 'bar.bon.bar_e3')) self.assertEqual( None, resolver.GetLink('baz.bon', 'bar_p3')) self.assertEqual( None, resolver.GetLink('a', 'falafel.faf')) self.assertEqual( None, resolver.GetLink('foo', 'bar_p3'))
def testGetLink(self): data_source = FakeAPIDataSource( json.loads(self._ReadLocalFile('fake_data_source.json'))) resolver = ReferenceResolver(data_source, data_source, TestObjectStore('test')) self.assertEqual({ 'href': 'foo.html', 'text': 'foo', 'name': 'foo' }, resolver.GetLink('foo', namespace='baz')) self.assertEqual( { 'href': 'foo.html#type-foo_t1', 'text': 'foo.foo_t1', 'name': 'foo_t1' }, resolver.GetLink('foo.foo_t1', namespace='baz')) self.assertEqual( { 'href': 'baz.html#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz.baz_e1', namespace='baz')) self.assertEqual( { 'href': 'baz.html#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz_e1', namespace='baz')) self.assertEqual( { 'href': 'foo.html#method-foo_f1', 'text': 'foo.foo_f1', 'name': 'foo_f1' }, resolver.GetLink('foo.foo_f1', namespace='baz')) self.assertEqual( { 'href': 'foo.html#property-foo_p3', 'text': 'foo.foo_p3', 'name': 'foo_p3' }, resolver.GetLink('foo.foo_p3', namespace='baz')) self.assertEqual( { 'href': 'bar.bon.html#type-bar_bon_t3', 'text': 'bar.bon.bar_bon_t3', 'name': 'bar_bon_t3' }, resolver.GetLink('bar.bon.bar_bon_t3', namespace='baz')) self.assertEqual( { 'href': 'bar.bon.html#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar_bon_p3', namespace='bar.bon')) self.assertEqual( { 'href': 'bar.bon.html#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar.bon.bar_bon_p3', namespace='bar.bon')) self.assertEqual( { 'href': 'bar.html#event-bar_e2', 'text': 'bar_e2', 'name': 'bar_e2' }, resolver.GetLink('bar.bar_e2', namespace='bar')) self.assertEqual( { 'href': 'bar.html#type-bon', 'text': 'bon', 'name': 'bon' }, resolver.GetLink('bar.bon', namespace='bar')) self.assertEqual( { 'href': 'foo.html#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual( { 'href': 'foo.html#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual( { 'href': 'foo.html#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_p1.foo_t3_e1', namespace='foo')) self.assertEqual( { 'href': 'bar.html#property-bar_t1-bar_t1_p1', 'text': 'bar.bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo')) self.assertEqual( { 'href': 'bar.html#property-bar_t1-bar_t1_p1', 'text': 'bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar_p3.bar_t1_p1', namespace='bar')) self.assertEqual( None, resolver.GetLink('bar.bar_p3.bar_t2_p1', namespace='bar')) self.assertEqual(None, resolver.GetLink('bar.bon.bar_e3', namespace='bar')) self.assertEqual(None, resolver.GetLink('bar_p3', namespace='baz.bon')) self.assertEqual(None, resolver.GetLink('falafel.faf', namespace='a')) self.assertEqual(None, resolver.GetLink('bar_p3', namespace='foo')) self.assertEqual( 'Hello <a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' '<a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hello $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', namespace='bar.bon')) self.assertEqual( 'I like <a href="bar.html#property-bar_t1-bar_t1_p1">food</a>.', resolver.ResolveAllLinks( 'I like $ref:[bar.bar_p3.bar_t1_p1 food].', namespace='foo')) self.assertEqual( 'Ref <a href="foo.html">It\'s foo!</a>', resolver.ResolveAllLinks('Ref $ref:[foo It\'s foo!]', namespace='bar')) self.assertEqual( 'Ref <a href="bar.html#type-bon">Bon</a>', resolver.ResolveAllLinks('Ref $ref:[bar.bon Bon]', namespace='bar')) # Different kinds of whitespace can be significant inside <pre> tags. self.assertEqual( '<pre><a href="bar.html#type-bon">bar.bon</a>({\nkey: value})', resolver.ResolveAllLinks('<pre>$ref:[bar.bon]({\nkey: value})', namespace='baz')) # Allow bare "$ref:foo.bar." at the end of a string. self.assertEqual( '<a href="bar.html#type-bon">bar.bon</a>.', resolver.ResolveAllLinks('$ref:bar.bon.', namespace='baz'))
def testGetLink(self): data_source = FakeAPIDataSource( json.loads(self._ReadLocalFile('fake_data_source.json'))) resolver = ReferenceResolver(data_source, data_source, InMemoryObjectStore('')) self.assertEqual( { 'href': 'foo.html#type-foo_t1', 'text': 'foo.foo_t1', 'name': 'foo_t1' }, resolver.GetLink('foo.foo_t1', 'baz')) self.assertEqual( { 'href': 'baz.html#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz.baz_e1', 'baz')) self.assertEqual( { 'href': 'baz.html#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz_e1', 'baz')) self.assertEqual( { 'href': 'foo.html#method-foo_f1', 'text': 'foo.foo_f1', 'name': 'foo_f1' }, resolver.GetLink('foo.foo_f1', 'baz')) self.assertEqual( { 'href': 'foo.html#property-foo_p3', 'text': 'foo.foo_p3', 'name': 'foo_p3' }, resolver.GetLink('foo.foo_p3', 'baz')) self.assertEqual( { 'href': 'bar.bon.html#type-bar_bon_t3', 'text': 'bar.bon.bar_bon_t3', 'name': 'bar_bon_t3' }, resolver.GetLink('bar.bon.bar_bon_t3', 'baz')) self.assertEqual( { 'href': 'bar.bon.html#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar_bon_p3', 'bar.bon')) self.assertEqual( { 'href': 'bar.bon.html#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar.bon.bar_bon_p3', 'bar.bon')) self.assertEqual( { 'href': 'bar.html#event-bar_e2', 'text': 'bar_e2', 'name': 'bar_e2' }, resolver.GetLink('bar.bar_e2', 'bar')) self.assertEqual( { 'href': 'bar.html#type-bon', 'text': 'bon', 'name': 'bon' }, resolver.GetLink('bar.bon', 'bar')) self.assertEqual( { 'href': 'foo.html#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo_t3.foo_t3_e1', 'foo')) self.assertEqual( { 'href': 'foo.html#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_t3.foo_t3_e1', 'foo')) self.assertEqual( { 'href': 'foo.html#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_p1.foo_t3_e1', 'foo')) self.assertEqual( { 'href': 'bar.html#property-bar_t1-bar_t1_p1', 'text': 'bar.bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar.bar_p3.bar_t1_p1', 'foo')) self.assertEqual( { 'href': 'bar.html#property-bar_t1-bar_t1_p1', 'text': 'bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar_p3.bar_t1_p1', 'bar')) self.assertEqual(None, resolver.GetLink('bar.bar_p3.bar_t2_p1', 'bar')) self.assertEqual(None, resolver.GetLink('bar.bon.bar_e3', 'bar')) self.assertEqual(None, resolver.GetLink('bar_p3', 'baz.bon')) self.assertEqual(None, resolver.GetLink('falafel.faf', 'a')) self.assertEqual(None, resolver.GetLink('bar_p3', 'foo')) self.assertEqual( 'Hello <a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' '<a href="bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' '<a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', resolver.ResolveAllLinks( 'Hello $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', 'bar.bon')) self.assertEqual( 'I like <a href="bar.html#property-bar_t1-bar_t1_p1">food</a>.', resolver.ResolveAllLinks( 'I like $ref:[bar.bar_p3.bar_t1_p1 food].', 'foo')) self.assertEqual('Ref <a href="bar.html#type-bon">bon</a>', resolver.ResolveAllLinks('Ref $ref:[bar.bon]', 'bar'))
def __init__(self, object_store_creator, compiled_fs_factory, branch_utility, host_file_system_provider, github_file_system_provider, base_path='/'): ''' |object_store_creator| The ObjectStoreCreator used to create almost all caches. |compiled_fs_factory| Factory used to create CompiledFileSystems, a higher-level cache type than ObjectStores. This can usually be derived from just |object_store_creator| but under special circumstances a different implementation needs to be passed in. |branch_utility| Has knowledge of Chrome branches, channels, and versions. |host_file_system_provider| Creates FileSystem instances which host the server at alternative revisions. |github_file_system_provider| Creates FileSystem instances backed by GitHub. |base_path| The path which all HTML is generated relative to. Usually this is / but some servlets need to override this. ''' self.object_store_creator = object_store_creator self.compiled_fs_factory = compiled_fs_factory self.host_file_system_provider = host_file_system_provider host_fs_at_trunk = host_file_system_provider.GetTrunk() self.github_file_system_provider = github_file_system_provider assert base_path.startswith('/') and base_path.endswith('/') self.base_path = base_path self.host_file_system_iterator = HostFileSystemIterator( host_file_system_provider, branch_utility) self.features_bundle = FeaturesBundle(host_fs_at_trunk, self.compiled_fs_factory, self.object_store_creator) self.api_models = APIModels(self.features_bundle, self.compiled_fs_factory, host_fs_at_trunk) self.availability_finder = AvailabilityFinder( branch_utility, compiled_fs_factory, self.host_file_system_iterator, host_fs_at_trunk, object_store_creator) self.api_list_data_source_factory = APIListDataSource.Factory( self.compiled_fs_factory, host_fs_at_trunk, self.features_bundle, self.object_store_creator) self.api_data_source_factory = APIDataSource.Factory( self.compiled_fs_factory, host_fs_at_trunk, svn_constants.API_PATH, self.availability_finder, branch_utility) self.ref_resolver_factory = ReferenceResolver.Factory( self.api_data_source_factory, self.api_models, object_store_creator) self.api_data_source_factory.SetReferenceResolverFactory( self.ref_resolver_factory) # Note: samples are super slow in the dev server because it doesn't support # async fetch, so disable them. if IsDevServer(): extension_samples_fs = EmptyDirFileSystem() app_samples_fs = EmptyDirFileSystem() else: extension_samples_fs = host_fs_at_trunk app_samples_fs = github_file_system_provider.Create( 'GoogleChrome', 'chrome-app-samples') self.samples_data_source_factory = SamplesDataSource.Factory( extension_samples_fs, app_samples_fs, CompiledFileSystem.Factory(object_store_creator), self.ref_resolver_factory, svn_constants.EXAMPLES_PATH, base_path) self.api_data_source_factory.SetSamplesDataSourceFactory( self.samples_data_source_factory) self.intro_data_source_factory = IntroDataSource.Factory( self.compiled_fs_factory, host_fs_at_trunk, self.ref_resolver_factory, [svn_constants.INTRO_PATH, svn_constants.ARTICLE_PATH]) self.path_canonicalizer = PathCanonicalizer(self.compiled_fs_factory, host_fs_at_trunk) self.content_providers = ContentProviders( self.compiled_fs_factory, host_fs_at_trunk, self.github_file_system_provider) # TODO(kalman): Move all the remaining DataSources into DataSourceRegistry, # then factor out the DataSource creation into a factory method, so that # the entire ServerInstance doesn't need to be passed in here. self.template_renderer = TemplateRenderer(self) self.strings_json_path = svn_constants.STRINGS_JSON_PATH self.manifest_json_path = svn_constants.MANIFEST_JSON_PATH self.manifest_features_path = svn_constants.MANIFEST_FEATURES_PATH
def testGetLink(self): resolver = ReferenceResolver(_FakeAPIModels(_TEST_DATA), TestObjectStore('test')) self.assertEqual({ 'href': 'foo', 'text': 'foo', 'name': 'foo' }, resolver.GetLink('foo', namespace='baz')) self.assertEqual({ 'href': 'foo#type-foo_t1', 'text': 'foo.foo_t1', 'name': 'foo_t1' }, resolver.GetLink('foo.foo_t1', namespace='baz')) self.assertEqual({ 'href': 'baz#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz.baz_e1', namespace='baz')) self.assertEqual({ 'href': 'baz#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, resolver.GetLink('baz_e1', namespace='baz')) self.assertEqual({ 'href': 'foo#method-foo_f1', 'text': 'foo.foo_f1', 'name': 'foo_f1' }, resolver.GetLink('foo.foo_f1', namespace='baz')) self.assertEqual({ 'href': 'foo#property-foo_p3', 'text': 'foo.foo_p3', 'name': 'foo_p3' }, resolver.GetLink('foo.foo_p3', namespace='baz')) self.assertEqual({ 'href': 'bar.bon#type-bar_bon_t3', 'text': 'bar.bon.bar_bon_t3', 'name': 'bar_bon_t3' }, resolver.GetLink('bar.bon.bar_bon_t3', namespace='baz')) self.assertEqual({ 'href': 'bar.bon#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar_bon_p3', namespace='bar.bon')) self.assertEqual({ 'href': 'bar.bon#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, resolver.GetLink('bar.bon.bar_bon_p3', namespace='bar.bon')) self.assertEqual({ 'href': 'bar#event-bar_e2', 'text': 'bar_e2', 'name': 'bar_e2' }, resolver.GetLink('bar.bar_e2', namespace='bar')) self.assertEqual({ 'href': 'bar#type-bon', 'text': 'bon', 'name': 'bon' }, resolver.GetLink('bar.bon', namespace='bar')) self.assertEqual({ 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual({ 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual({ 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, resolver.GetLink('foo.foo_p1.foo_t3_e1', namespace='foo')) self.assertEqual({ 'href': 'bar#property-bar_t1-bar_t1_p1', 'text': 'bar.bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo')) self.assertEqual({ 'href': 'bar#property-bar_t1-bar_t1_p1', 'text': 'bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, resolver.GetLink('bar_p3.bar_t1_p1', namespace='bar')) self.assertEqual( None, resolver.GetLink('bar.bar_p3.bar_t2_p1', namespace='bar')) self.assertEqual( None, resolver.GetLink('bar.bon.bar_e3', namespace='bar')) self.assertEqual( None, resolver.GetLink('bar_p3', namespace='baz.bon')) self.assertEqual( None, resolver.GetLink('falafel.faf', namespace='a')) self.assertEqual( None, resolver.GetLink('bar_p3', namespace='foo'))
def _CreateRefResolver(self, filename): data_source = FakeAPIAndListDataSource(self._LoadJSON(filename)) return ReferenceResolver.Factory(data_source, data_source, InMemoryObjectStore('')).Create()
def testGetLink(self): apps_resolver = ReferenceResolver( _FakePlatformBundle().GetAPIModels('apps'), TestObjectStore('apps/test')) extensions_resolver = ReferenceResolver( _FakePlatformBundle().GetAPIModels('extensions'), TestObjectStore('extensions/test')) self.assertEqual({ 'href': 'foo', 'text': 'foo', 'name': 'foo' }, apps_resolver.GetLink('foo', namespace='baz')) self.assertEqual( { 'href': 'foo#type-foo_t1', 'text': 'foo.foo_t1', 'name': 'foo_t1' }, apps_resolver.GetLink('foo.foo_t1', namespace='baz')) self.assertEqual( { 'href': 'baz#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, apps_resolver.GetLink('baz.baz_e1', namespace='baz')) self.assertEqual( { 'href': 'baz#event-baz_e1', 'text': 'baz_e1', 'name': 'baz_e1' }, apps_resolver.GetLink('baz_e1', namespace='baz')) self.assertEqual( { 'href': 'foo#method-foo_f1', 'text': 'foo.foo_f1', 'name': 'foo_f1' }, apps_resolver.GetLink('foo.foo_f1', namespace='baz')) self.assertEqual( { 'href': 'foo#property-foo_p3', 'text': 'foo.foo_p3', 'name': 'foo_p3' }, apps_resolver.GetLink('foo.foo_p3', namespace='baz')) self.assertEqual( { 'href': 'bar.bon#type-bar_bon_t3', 'text': 'bar.bon.bar_bon_t3', 'name': 'bar_bon_t3' }, apps_resolver.GetLink('bar.bon.bar_bon_t3', namespace='baz')) self.assertEqual( { 'href': 'bar.bon#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, apps_resolver.GetLink('bar_bon_p3', namespace='bar.bon')) self.assertEqual( { 'href': 'bar.bon#property-bar_bon_p3', 'text': 'bar_bon_p3', 'name': 'bar_bon_p3' }, apps_resolver.GetLink('bar.bon.bar_bon_p3', namespace='bar.bon')) self.assertEqual( { 'href': 'bar#event-bar_e2', 'text': 'bar_e2', 'name': 'bar_e2' }, apps_resolver.GetLink('bar.bar_e2', namespace='bar')) self.assertEqual({ 'href': 'bar#type-bon', 'text': 'bon', 'name': 'bon' }, apps_resolver.GetLink('bar.bon', namespace='bar')) self.assertEqual( { 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, apps_resolver.GetLink('foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual( { 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, apps_resolver.GetLink('foo.foo_t3.foo_t3_e1', namespace='foo')) self.assertEqual( { 'href': 'foo#event-foo_t3-foo_t3_e1', 'text': 'foo_t3.foo_t3_e1', 'name': 'foo_t3_e1' }, apps_resolver.GetLink('foo.foo_p1.foo_t3_e1', namespace='foo')) self.assertEqual( { 'href': 'bar#property-bar_t1-bar_t1_p1', 'text': 'bar.bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, apps_resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo')) # Test extensions_resolver. self.assertEqual( { 'href': 'bar#property-bar_t1-bar_t1_p1', 'text': 'bar.bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, extensions_resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo')) self.assertEqual( { 'href': 'bar#property-bar_t1-bar_t1_p1', 'text': 'bar_t1.bar_t1_p1', 'name': 'bar_t1_p1' }, apps_resolver.GetLink('bar_p3.bar_t1_p1', namespace='bar')) self.assertEqual( None, apps_resolver.GetLink('bar.bar_p3.bar_t2_p1', namespace='bar')) self.assertEqual( None, apps_resolver.GetLink('bar.bon.bar_e3', namespace='bar')) self.assertEqual(None, apps_resolver.GetLink('bar_p3', namespace='baz.bon')) self.assertEqual(None, apps_resolver.GetLink('falafel.faf', namespace='a')) self.assertEqual(None, apps_resolver.GetLink('bar_p3', namespace='foo')) # Exists in apps but not extensions. self.assertEqual( None, extensions_resolver.GetLink('foo.foo_p3', namespace='baz'))