Example #1
0
def _calculate_deps(js_entrypoint_file_path):
    js_sources = set()
    source_files = set()
    logging.info("Scanning paths for Javascript files...")
    for js_path in loader.locate("*.js"):
        if not js_path.startswith(coverage.INSTRUMENTED_CODE_PATH):
            source_files.add(js_path)

    for js_path in source_files:
        js_sources.add(closurebuilder._PathSource(js_path))

    logging.info("Done")
    logging.info("Building dependency tree..")
    tree = depstree.DepsTree(js_sources)

    # find the namespace of entrypoint
    entrypoint_source = closurebuilder._PathSource(js_entrypoint_file_path)
    if entrypoint_source.provides:
        namespace = entrypoint_source.provides
    else:
        namespace = entrypoint_source.requires

    # namespace = [closurebuilder._PathSource(js_entrypoint_file_path).provides.pop()]
    # The Closure Library base file must go first.
    base = closurebuilder._GetClosureBaseFile(js_sources)
    deps = [base] + tree.GetDependencies(namespace)
    logging.info("Done")
    return deps
Example #2
0
    def build_minified(self):
        from distutils import log
        import closurebuilder
        import treescan
        import depstree
        log.info('Building minified script "%s", mode: %s',
                 self.minified, self.output_mode)
        log.info('Scanning paths...')
        sources = set(
            (closurebuilder._PathSource(js_path)
             for path in (self.root, self.project,)
             for js_path in treescan.ScanTreeForJsFiles(path)
            ))

        log.info('%s sources scanned.', len(sources))
        log.info('Building dependency tree..')
        tree = depstree.DepsTree(sources)

        input_namespaces = set(self.namespaces)

        for input_path in self.inputs:
            js_input = closurebuilder._GetInputByPath(input_path, sources)
            if not js_input:
                msg = 'No source matched input %s' % input_path
                log.error(msg)
                raise DistutilsError, msg

            input_namespaces.update(js_input.provides)

        if not input_namespaces:
            msg = ('No namespaces found. At least one namespace must be '
                   'specified with the --namespaces or --inputs flags.')
            log.error(msg)
            raise DistutilsError, msg

        base = closurebuilder._GetClosureBaseFile(sources)
        deps = [base] + tree.GetDependencies(input_namespaces)

        if self.output_mode == 'list':
            log.info('Listing files:')
            log.info('\n'.join([js_source.GetPath() for js_source in deps]))
            log.info('Build successful!')
            return

        out = open(self.minified, 'w')

        if self.output_mode == 'script':
            out.writelines([js_source.GetSource() for js_source in deps])
            out.close()
            log.info('Build successful!')
            return

        import jscompiler
        compiled_source = jscompiler.Compile(
            self.compiler_jar,
            [js_source.GetPath() for js_source in deps],
            self.compiler_flags)

        if compiled_source is None:
            msg = 'JavaScript compilation failed.'
            log.error(msg)
            raise DistutilsError, msg
        else:
            log.info('JavaScript compilation succeeded.')
            out.write(compiled_source)
            log.info('Build successful!')

        out.close()
Example #3
0
def main():
  logging.basicConfig(format=(sys.argv[0] + ': %(message)s'),
                      level=logging.INFO)
  options, args = _GetOptionsParser().parse_args()

  if not options.modules:
    logging.error('No modules specified')
    sys.exit(1)

  # Make our output pipe.
  global out
  if options.output_file:
    out = open(options.output_file, 'w')
  else:
    out = sys.stdout

  options.keep_dep_tags = ParseBoolean(options.keep_dep_tags)
  options.keep_base_separate = ParseBoolean(options.keep_base_separate)

  sources = set()

  logging.info('Scanning paths...')
  for path in options.roots:
    for js_path in treescan.ScanTreeForJsFiles(path):
      sources.add(closurebuilder._PathSource(js_path))
  logging.info('%s sources scanned.', len(sources))

  # Add scripts specified on the command line.
  for path in args:
    sources.add(source.Source(closurebuilder._PathSource(path)))

  moduleBlocks = []
  for modcmd in options.modules:
    modSpec = modcmd.split(':')
    if len(modSpec) != 2:
      logging.error('Incorrect module specification: %s', modcmd)
      sys.exit(1)
    name = modSpec[0]
    namespaces = _ExtractNamespaces(modSpec[1], sources, allowWildCards=True)
    moduleBlocks.append(( name, namespaces ))

  modules = _generateModules(sources, moduleBlocks, keepBaseSeparate=options.keep_base_separate)

  output_mode = options.output_mode
  if output_mode == 'cmdline':
    out.writelines(_generateCommandLine(modules, keepDeps=options.keep_dep_tags))
  elif output_mode == 'compiled':

    # Make sure a .jar is specified.
    if not options.compiler_jar:
      logging.error('--compiler_jar flag must be specified if --output is '
                    '"compiled"')
      sys.exit(1)

    paths = []
    for name, deps, moddeps in modules:
      paths += [src.GetPath() for src in deps]

    compiler_flags = _getModuleFlags(modules, keepDeps=options.keep_dep_tags)
    if options.compiler_flags:
      compiler_flags += options.compiler_flags.split()

    compiled_source = jscompiler.Compile(options.compiler_jar,
      paths,
      compiler_flags
    )

    if compiled_source is None:
      logging.error('JavaScript compilation failed.')
      sys.exit(1)
    else:
      logging.info('JavaScript compilation succeeded.')
      out.write(compiled_source)

  else:
    logging.error('Invalid value for --output flag.')
    sys.exit(1)

  options.list_unused_files = ParseBoolean(options.list_unused_files)

  # todo: this overlapping could be used to generate _two_ deps files!
  # one with all files, and one with the compiled modules (merged with others).
  if options.list_unused_files:
    # could output contained modules also?
    all_src = set([src.GetPath() for src in sources])
    mod_src = set()
    for mod in modules:
      mod_src.update([src.GetPath() for src in mod[1]])
    orphans = all_src - mod_src
    if len(orphans) > 0:
      out.write('Orphan files in the input tree:\n' + '\n'.join(sorted(orphans, key=str.lower)))