Пример #1
0
    def run(self):
        sections = self.sections()
        # @@ how much of this is shared with merge.py?
        for section in sections:
            cfg = self.make_cfg(section)
            #@@ use logging
            print("Extracting docs for %s" % section)
            sourcedir = cfg['root']
            outdir = cfg['output']
            # gather data for each source file
            files = {}
            for root, dirs, entries in os.walk(sourcedir):
                for filename in entries:
                    if filename.endswith(
                            SUFFIX_JS) and not filename.startswith("."):
                        filepath = os.path.join(root,
                                                filename)[len(sourcedir) + 1:]
                        jsfile = SourceFile.from_filename(
                            os.path.join(sourcedir, filepath), cfg)
                        if jsfile.data:
                            files[filepath] = jsfile

            # create dict of dependencies
            dependencies = {}
            for filepath, jsfile in files.items():
                dependencies[filepath] = jsfile.extends

            # extend data with any data from parents
            for filepath in tsort.sort(dependencies):
                jsfile = files[filepath]
                if jsfile.extends:
                    jsfile.inherit([
                        files[parentpath]
                        for parentpath in sorted(jsfile.extends, reverse=True)
                        if parentpath in files
                    ])

                # parse template for each file
                template_filename = os.path.join(
                    sourcedir,
                    filepath.split(SUFFIX_JS)[0] + SUFFIX_JST)
                if not os.path.exists(template_filename):
                    # throw something if template not given in config here
                    template_filename = cfg["template"]
                template = Template(open(template_filename, "U").read())
                out = template.render(jsfile.data)
                output_filename = os.path.join(
                    outdir,
                    filepath.split(SUFFIX_JS)[0] + SUFFIX_RST)
                output_dirname = os.path.dirname(output_filename)
                if not os.path.exists(output_dirname):
                    os.makedirs(output_dirname)
                f = open(output_filename, "w")
                f.write(out)
                f.close()
Пример #2
0
 def run(self):
     sections = self.sections()
     # @@ how much of this is shared with merge.py?
     for section in sections:
         cfg = self.make_cfg(section)
         #@@ use logging
         print("Extracting docs for %s" % section)
         sourcedir = cfg['root']
         outdir = cfg['output']
         # gather data for each source file
         files = {}
         for root, dirs, entries in os.walk(sourcedir):
             for filename in entries:
                 if filename.endswith(SUFFIX_JS) and not filename.startswith("."):
                     filepath = os.path.join(root, filename)[len(sourcedir)+1:]
                     jsfile = SourceFile.from_filename(
                         os.path.join(sourcedir, filepath),
                         cfg)
                     if jsfile.data:
                         files[filepath] = jsfile
     
         # create dict of dependencies
         dependencies = {}
         for filepath, jsfile in files.items():
             dependencies[filepath] = jsfile.extends
         
         # extend data with any data from parents
         for filepath in tsort.sort(dependencies):
             jsfile = files[filepath]
             if jsfile.extends:
                 jsfile.inherit([files[parentpath] for parentpath in sorted(jsfile.extends, reverse=True) if parentpath in files])
                 
             # parse template for each file
             template_filename = os.path.join(sourcedir, filepath.split(SUFFIX_JS)[0] + SUFFIX_JST)
             if not os.path.exists(template_filename):
                 # throw something if template not given in config here
                 template_filename = cfg["template"]
             template = Template(open(template_filename, "U").read())
             out = template.render(jsfile.data)
             output_filename = os.path.join(outdir, filepath.split(SUFFIX_JS)[0] + SUFFIX_RST)
             output_dirname = os.path.dirname(output_filename)
             if not os.path.exists(output_dirname):
                 os.makedirs(output_dirname)
             f = open(output_filename, "w")
             f.write(out)
             f.close()
Пример #3
0
    def extract_deps(self, cfg, depmap=None):
        #@@ this function needs to be decomposed into smaller testable bits
        sourcedirs = cfg['root']

        # assemble all files in source directory according to config
        include = cfg.get('include', tuple())
        exclude = [Exclude(e) for e in cfg['exclude']]
        all_inc = cfg['first'] + cfg['include'] + cfg['last']
        files = {}
        implicit = False
        if not len(include):            
            # implicit file inclusion
            implicit = True

        for sourcedir in sourcedirs:
            newfiles = []
            for filepath in jsfiles_for_dir(os.path.join(self.root_dir, sourcedir)):
                fitem = filepath, srcfile = filepath, self.make_sourcefile(sourcedir, filepath, exclude),
                if implicit and not filepath in exclude:
                    all_inc.append(filepath)
                newfiles.append(fitem)

            newfiles = list((filepath, sf) for filepath, sf in newfiles if filepath in all_inc and filepath not in exclude)
            files.update(dict(newfiles))

        # ensure all @include and @requires references are in
        complete = False
        while not complete:
            complete = True
            for filepath, info in files.items():
                for path in info.include + info.requires:
                    if path not in exclude and not files.has_key(path):
                        complete = False
                        for sourcedir in sourcedirs:
                            if os.path.exists(os.path.join(self.root_dir, sourcedir, path)):
                                files[path] = self.make_sourcefile(sourcedir, path, exclude)
                                break
                        else:
                            raise MissingImport("File '%s' not found in root directories" % path)
        
        # create list of dependencies
        dependencies = {}
        for filepath, info in files.items():
            dependencies[filepath] = info.requires

        
        # get tuple of files ordered by dependency
        self.printer.debug("Sorting dependencies.")
        order = [x for x in tsort.sort(dependencies)]

        # move forced first and last files to the required position
        self.printer.debug("Re-ordering files.")
        order = cfg['first'] + [item
                     for item in order
                     if ((item not in cfg['first']) and
                         (item not in cfg['last']))] + cfg['last']

        parts = ('first', 'include', 'last')
        required_files = []
        
        ## Make sure all imports are in files dictionary
        for part in parts:
            for fp in cfg[part]:
                if not fp in exclude and not files.has_key(fp):
                    raise MissingImport("File from '%s' not found: %s" % (part, fp))

        ## Output the files in the determined order
        result = []
        for fp in order:
            result.append(files[fp])

        return result
Пример #4
0
    def merge(self, cfg, depmap=None):
        #@@ this function needs to be decomposed into smaller testable bits
        sourcedirs = cfg['root']

        # assemble all files in source directory according to config
        include = cfg.get('include', tuple())
        exclude = cfg['exclude']
        all_inc = cfg['first'] + cfg['include'] + cfg['last']
        files = {}
        implicit = False
        if not len(include):
            # implicit file inclusion
            implicit = True

        for sourcedir in sourcedirs:
            newfiles = []
            for filepath in jsfiles_for_dir(sourcedir):
                fitem = filepath, srcfile = filepath, self.make_sourcefile(
                    sourcedir, filepath, exclude),
                if implicit and not filepath in exclude:
                    all_inc.append(filepath)
                newfiles.append(fitem)

            newfiles = list((filepath, sf) for filepath, sf in newfiles
                            if filepath in all_inc and filepath not in exclude)
            files.update(dict(newfiles))

        # ensure all @include and @requires references are in
        complete = False
        while not complete:
            complete = True
            for filepath, info in files.items():
                for path in info.include + info.requires:
                    if path not in cfg['exclude'] and not files.has_key(path):
                        complete = False
                        for sourcedir in sourcedirs:
                            if os.path.exists(os.path.join(sourcedir, path)):
                                files[path] = self.make_sourcefile(
                                    sourcedir, path, exclude)
                                break
                        else:
                            raise MissingImport(
                                "File '%s' not found in root directories" %
                                path)

        # create list of dependencies
        dependencies = {}
        for filepath, info in files.items():
            dependencies[filepath] = info.requires

        # get tuple of files ordered by dependency
        self.printer("Sorting dependencies.")
        order = [x for x in tsort.sort(dependencies)]

        # move forced first and last files to the required position
        self.printer("Re-ordering files.")
        order = cfg['first'] + [
            item for item in order if (
                (item not in cfg['first']) and (item not in cfg['last']))
        ] + cfg['last']

        parts = ('first', 'include', 'last')
        required_files = []

        ## Make sure all imports are in files dictionary
        for part in parts:
            for fp in cfg[part]:
                if not fp in cfg['exclude'] and not files.has_key(fp):
                    raise MissingImport("File from '%s' not found: %s" %
                                        (part, fp))

        ## Header inserted at the start of each file in the output
        HEADER = "/* " + "=" * 70 + "\n    %s\n" + "   " + "=" * 70 + " */\n\n"

        ## Output the files in the determined order
        result = []
        for fp in order:
            f = files[fp]
            self.printer("Exporting: " + f.filepath)
            result.append(HEADER % f.filepath)
            source = f.source
            result.append(source)
            if not source.endswith("\n"):
                result.append("\n")

        self.printer("\nTotal files merged: %d " % len(files))
        merged = "".join(result)
        if cfg['closure']:
            merged = '(function(){%s})();' % merged
        return merged
Пример #5
0
    def merge(self, cfg, depmap=None):
        # @@ this function needs to be decomposed into smaller testable bits
        sourcedirs = cfg["root"]

        # assemble all files in source directory according to config
        include = cfg.get("include", tuple())
        exclude = cfg["exclude"]
        all_inc = cfg["first"] + cfg["include"] + cfg["last"]
        files = {}
        implicit = False
        if not len(include):
            # implicit file inclusion
            implicit = True

        for sourcedir in sourcedirs:
            newfiles = []
            for filepath in jsfiles_for_dir(sourcedir):
                fitem = filepath, srcfile = filepath, self.make_sourcefile(sourcedir, filepath, exclude)
                if implicit and not filepath in exclude:
                    all_inc.append(filepath)
                newfiles.append(fitem)

            newfiles = list(
                (filepath, sf) for filepath, sf in newfiles if filepath in all_inc and filepath not in exclude
            )
            files.update(dict(newfiles))

        # ensure all @include and @requires references are in
        complete = False
        while not complete:
            complete = True
            for filepath, info in files.items():
                for path in info.include + info.requires:
                    if path not in cfg["exclude"] and not files.has_key(path):
                        complete = False
                        for sourcedir in sourcedirs:
                            if os.path.exists(os.path.join(sourcedir, path)):
                                files[path] = self.make_sourcefile(sourcedir, path, exclude)
                                break
                        else:
                            raise MissingImport("File '%s' not found in root directories" % path)

        # create list of dependencies
        dependencies = {}
        for filepath, info in files.items():
            dependencies[filepath] = info.requires

        # get tuple of files ordered by dependency
        self.printer("Sorting dependencies.")
        order = [x for x in tsort.sort(dependencies)]

        # move forced first and last files to the required position
        self.printer("Re-ordering files.")
        order = (
            cfg["first"]
            + [item for item in order if ((item not in cfg["first"]) and (item not in cfg["last"]))]
            + cfg["last"]
        )

        parts = ("first", "include", "last")
        required_files = []

        ## Make sure all imports are in files dictionary
        for part in parts:
            for fp in cfg[part]:
                if not fp in cfg["exclude"] and not files.has_key(fp):
                    raise MissingImport("File from '%s' not found: %s" % (part, fp))

        ## Header inserted at the start of each file in the output
        HEADER = "/* " + "=" * 70 + "\n    %s\n" + "   " + "=" * 70 + " */\n\n"

        ## Output the files in the determined order
        result = []
        for fp in order:
            f = files[fp]
            self.printer("Exporting: " + f.filepath)
            result.append(HEADER % f.filepath)
            source = f.source
            result.append(source)
            if not source.endswith("\n"):
                result.append("\n")

        self.printer("\nTotal files merged: %d " % len(files))
        merged = "".join(result)
        if cfg["closure"]:
            merged = "(function(){%s})();" % merged
        return merged
Пример #6
0
    def extract_deps(self, cfg, depmap=None):
        #@@ this function needs to be decomposed into smaller testable bits
        sourcedirs = cfg['root']

        # assemble all files in source directory according to config
        include = cfg.get('include', tuple())
        exclude = [Exclude(e) for e in cfg['exclude']]
        all_inc = cfg['first'] + cfg['include'] + cfg['last']
        files = {}
        implicit = False
        if not len(include):
            # implicit file inclusion
            implicit = True

        for sourcedir in sourcedirs:
            newfiles = []
            for filepath in jsfiles_for_dir(os.path.join(self.root_dir, sourcedir)):
                fitem = filepath, srcfile = filepath, self.make_sourcefile(sourcedir, filepath, exclude),
                if implicit and not filepath in exclude:
                    all_inc.append(filepath)
                newfiles.append(fitem)

            newfiles = list((filepath, sf) for filepath, sf in newfiles if filepath in all_inc and filepath not in exclude)
            files.update(dict(newfiles))

        # ensure all @include and @requires references are in
        complete = False
        while not complete:
            complete = True
            for filepath, info in files.items():
                for path in info.include + info.requires:
                    if path not in exclude and not files.has_key(path):
                        complete = False
                        for sourcedir in sourcedirs:
                            if os.path.exists(os.path.join(self.root_dir, sourcedir, path)):
                                files[path] = self.make_sourcefile(sourcedir, path, exclude)
                                break
                        else:
                            raise MissingImport("File '%s' not found in root directories" % path)

        # create list of dependencies
        dependencies = {}
        for filepath, info in files.items():
            dependencies[filepath] = info.requires


        # get tuple of files ordered by dependency
        self.printer.debug("Sorting dependencies.")
        order = [x for x in tsort.sort(dependencies)]

        # move forced first and last files to the required position
        self.printer.debug("Re-ordering files.")
        order = cfg['first'] + [item
                     for item in order
                     if ((item not in cfg['first']) and
                         (item not in cfg['last']))] + cfg['last']

        parts = ('first', 'include', 'last')
        required_files = []

        ## Make sure all imports are in files dictionary
        for part in parts:
            for fp in cfg[part]:
                if not fp in exclude and not files.has_key(fp):
                    raise MissingImport("File from '%s' not found: %s" % (part, fp))

        ## Output the files in the determined order
        result = []
        for fp in order:
            result.append(files[fp])

        return result