def LoadModule(self, module_name=None, module_filename=None): assert bool(module_name) ^ bool( module_filename), 'Must provide module_name or module_filename.' if module_filename: resource = self.FindResource(module_filename) if not resource: raise Exception('Could not find %s in %s' % (module_filename, repr(self.source_paths))) module_name = resource.name if resource.absolute_path.endswith('__init__.js'): old_style_filename = os.path.dirname( resource.absolute_path) + '.js' if os.path.exists(old_style_filename): raise module.DepsException( 'While loading __init__.js of %s, found %s which should never exist', module_name, old_style_filename) else: resource = None # Will be set if we end up needing to load. if module_name in self.loaded_modules: assert self.loaded_modules[module_name].contents return self.loaded_modules[module_name] if not resource: # happens when module_name was given resource = self.FindModuleResource(module_name) if not resource: raise module.DepsException('No resource for module "%s"' % module_name) m = js_module.JSModule(self, module_name, resource) m.Parse() self.loaded_modules[module_name] = m m.Load() return m
def LoadImage(self, abs_path): if abs_path in self.loaded_images: return self.loaded_images[abs_path] if not os.path.exists(abs_path): raise module.DepsException("url('%s') did not exist" % abs_path) res = self.FindResourceGivenAbsolutePath(abs_path, binary=True) if res is None: raise module.DepsException("url('%s') was not in search path" % abs_path) image = style_sheet_module.Image(res) self.loaded_images[abs_path] = image return image
def LoadModule(self, module_name=None, module_filename=None): assert bool(module_name) ^ bool( module_filename), 'Must provide module_name or module_filename.' if module_filename: resource = self.FindResource(module_filename) if not resource: raise Exception('Could not find %s in %s' % (module_filename, repr(self.source_paths))) module_name = resource.name else: resource = None # Will be set if we end up needing to load. if module_name in self.loaded_modules: assert self.loaded_modules[module_name].contents return self.loaded_modules[module_name] if not resource: # happens when module_name was given resource = self.FindModuleResource(module_name) if not resource: raise module.DepsException('No resource for module "%s"' % module_name) m = html_module.HTMLModule(self, module_name, resource) self.loaded_modules[module_name] = m # Fake it, this is probably either polymer.min.js or platform.js which are # actually .js files.... if resource.absolute_path.endswith('.js'): return m m.Parse() m.Load() return m
def LoadModule(self, module_name=None, module_filename=None): assert bool(module_name) ^ bool( module_filename), 'Must provide module_name or module_filename.' if module_filename: resource = self.FindResource(module_filename) if not resource: raise Exception('Could not find %s in %s' % (module_filename, repr(self.source_paths))) module_name = resource.name else: resource = None # Will be set if we end up needing to load. if module_name in self.loaded_modules: assert self.loaded_modules[module_name].contents return self.loaded_modules[module_name] if not resource: # happens when module_name was given resource = self.FindModuleResource(module_name) if not resource: raise module.DepsException('No resource for module "%s"' % module_name) if resource.absolute_path.endswith('.js'): raise Exception(".js modules are deprecated") m = html_module.HTMLModule(self, module_name, resource) m.Parse() self.loaded_modules[module_name] = m m.Load() return m
def FindModuleResource(self, requested_module_name): """Finds a module javascript file and returns a Resource, or none.""" # TODO(nduca): Look for name/__init__.js as well as name.js js_resource = self._FindResourceGivenNameAndSuffix( requested_module_name, '.js', return_resource=True) if not js_resource: js_resource = self._FindResourceGivenNameAndSuffix( requested_module_name + '.__init__', '.js', return_resource=True) else: # Verify that no __init__.js exists. init_resource = self._FindResourceGivenNameAndSuffix( requested_module_name + '.__init__', '.js', return_resource=True) if init_resource: raise module.DepsException( 'While loading "%s", found a __init__.js form as well', requested_module_name) html_resource = self._FindResourceGivenNameAndSuffix( requested_module_name, '.html', return_resource=True) if js_resource and html_resource: if module.Module.html_contents_is_polymer_module( html_resource.contents): return html_resource return js_resource elif js_resource: return js_resource return html_resource
def _HRefToResource(loader, module_name, module_dir_name, href, tag_for_err_msg): if href[0] == '/': resource = loader.FindResourceGivenRelativePath(href[1:]) else: abspath = os.path.normpath(os.path.join(module_dir_name, href)) resource = loader.FindResourceGivenAbsolutePath(abspath) if not resource: raise module.DepsException('In %s, the %s cannot be loaded because ' \ 'it is not in the search path' % (module_name, tag_for_err_msg)) try: resource_contents = resource.contents except: raise module.DepsException('In %s, %s points at a nonexistant file ' % (module_name, tag_for_err_msg)) return resource
def GetInlineScriptContentWithPolymerizingApplied(inline_script): polymer_element_name = GetPolymerElementNameFromOpenTags( inline_script.open_tags) if polymer_element_name is None: raise module.DepsException( 'Tagless Polymer() call must be made inside a <polymer-element> tag' ) return UpdatePolymerCallsGivenElementName(inline_script.stripped_contents, polymer_element_name)
def Parse(self): stripped_text = self.loader.GetStrippedJSForFilename(self.resource.absolute_path, early_out_if_no_tvcm=False) if self.name != 'tvcm': if not IsJSModule(stripped_text, text_is_stripped=True): raise module.DepsException('%s is not a JS Module' % self.name) ValidateUsesStrictMode(self.name, stripped_text) if IsJSTest(stripped_text, text_is_stripped=True): ValidateTestSuiteDefinition(self.name, stripped_text) self.dependency_metadata = Parse(self.name, stripped_text)
def LoadStyleSheet(self, name): if name in self.loaded_style_sheets: return self.loaded_style_sheets[name] resource = self._FindResourceGivenNameAndSuffix(name, '.css', return_resource=True) if not resource: raise module.DepsException('Could not find a file for stylesheet %s' % name) style_sheet = style_sheet_module.StyleSheet(self, name, resource) style_sheet.load() self.loaded_style_sheets[name] = style_sheet return style_sheet
def LoadHTMLTemplate(self, name): if name in self.loaded_html_templates: return self.loaded_html_templates[name] resource = self._FindResourceGivenNameAndSuffix(name, '.html', return_resource=True) if not resource: raise module.DepsException( 'Could not find a file for html template named %s' % name) html_template = module.HTMLTemplate(name, resource.absolute_path, resource.contents) self.loaded_html_templates[name] = html_template return html_template
def ValidateUsesStrictMode(module_name, stripped_text): """Check that the first non-empty line is 'use strict';. Args: stripped_text: Javascript source code with comments stripped out. Raises: DepsException: This file doesn't use strict mode. """ lines = stripped_text.split('\n') for line in lines: line = line.strip() if len(line.strip()) == 0: continue if """'use strict';""" in line.strip(): break raise module.DepsException('%s must use strict mode' % module_name)
def LoadRawScript(self, relative_raw_script_path): resource = None for source_path in self.source_paths: possible_absolute_path = os.path.join(source_path, relative_raw_script_path) if os.path.exists(possible_absolute_path): resource = resource_module.Resource(source_path, possible_absolute_path) break if not resource: raise module.DepsException('Could not find a file for raw script %s in %s' % ( relative_raw_script_path, self.source_paths)) assert relative_raw_script_path == resource.unix_style_relative_path, \ 'Expected %s == %s' % (relative_raw_script_path, resource.unix_style_relative_path) if resource.absolute_path in self.loaded_raw_scripts: return self.loaded_raw_scripts[resource.absolute_path] raw_script = module.RawScript(resource) self.loaded_raw_scripts[resource.absolute_path] = raw_script return raw_script
def __init__(self, soup): if not soup: raise module.DepsException('InlineScript created without soup') self._soup = soup self._stripped_contents = None self._open_tags = None
def Parse(module_name, stripped_text): """Parses the tvcm.require* lines in the module and returns module.ModuleDependencyMetadata. Args: stripped_text: Javascript source code with comments stripped out. Raises: DepsException: The name of a resource was not formatted properly. """ res = module.ModuleDependencyMetadata() if module_name != 'tvcm': res.dependent_module_names.append('tvcm') if not module_name: raise Exception("Module.name must be set.") rest = stripped_text while True: # Search for require statements in the rest of the file. m_r = re.search("""tvcm\s*\.\s*require\((["'])(.+?)\\1\)""", rest, re.DOTALL) m_s = re.search("""tvcm\s*\.\s*requireStylesheet\((["'])(.+?)\\1\)""", rest, re.DOTALL) m_t = re.search("""tvcm\s*\.\s*requireTemplate\((["'])(.+?)\\1\)""", rest, re.DOTALL) m_irs = re.search("""tvcm\s*\.\s*requireRawScript\((["'])(.+?)\\1\)""", rest, re.DOTALL) matches = [m for m in [m_r, m_s, m_t, m_irs] if m] # Figure out which was first. matches.sort(key=lambda x: x.start()) if len(matches): m = matches[0] else: break if m == m_r: dependent_module_name = m.group(2) if '/' in dependent_module_name: raise module.DepsException('Slashes are not allowed in module names. ' "Use '.' instead: %s" % dependent_module_name) if dependent_module_name.endswith('js'): raise module.DepsException("module names shouldn't end with .js" 'The module system will append that for you: %s' % dependent_module_name) res.dependent_module_names.append(dependent_module_name) elif m == m_s: style_sheet_name = m.group(2) if '/' in style_sheet_name: raise module.DepsException('Slashes are not allowed in style sheet names. ' "Use '.' instead: %s" % style_sheet_name) if style_sheet_name.endswith('.css'): raise module.DepsException('Style sheets should not end in .css. ' 'The module system will append that for you: %s' % style_sheet_name) res.style_sheet_names.append(style_sheet_name) elif m == m_t: html_template_name = m.group(2) if '/' in html_template_name: raise module.DepsException('Slashes are not allowed in html template names. ' "Use '.' instead: %s" % html_template_name) if html_template_name.endswith('.html'): raise module.DepsException( 'HTML templates resource names should not include extension. ' 'The module system will append that for you.' % html_template_name) res.html_template_names.append(html_template_name) elif m == m_irs: name = m.group(2) res.dependent_raw_script_relative_paths.append(name) rest = rest[m.end():] return res