def publish_documentation(docs, ftpsite=None, login=None, password=None,
                          key_save="my_password", footer_html=None, content_filter=trigger_on_specific_strings,
                          is_binary=content_as_binary, force_allow=None, fLOG=print):
    """
    publish the documentation and the setups of a python module on a webiste,
    it assumes the modules is organized the same way as
    `pyquickhelper <http://www.xavierdupre.fr/app/pyquickhelper/helpsphinx/index.html>`_.

    @param      docs            list of dictionaries (see below)
    @param      ftpsite         something like ``ftp.something.``
    @param      login           login
    @param      password        password
    @param      key_save        see function `open_window_params <http://www.xavierdupre.fr/app/pyquickhelper/helpsphinx/pyquickhelper/funcwin/frame_params.html#pyquickhelper.funcwin.frame_params.open_window_params>`_
    @param      footer_html     append this HTML code to any uploaded page (such a javascript code to count the audience)
    @param      content_filter  filter the content of a file (it raises an exception if the result is None),
                                appies only on text files
    @param      is_binary       a function to tell if a content of a file is binary or not
    @param      force_allow     a file is not published if it contains something which looks like credentials
                                except if this string is part of *force_allow*
    @param      fLOG            logging function

    *docs* is a list of dictionaries which must contain for each folder
    to transfer:

    - ``local``: local folder
    - ``root_local``: local paths will be related to this root
    - ``root_web``: prefix to add to the remote paths
    - ``status_file``: a file where the function populates the transfered files and some information about them

    A local file is composed by ``<local_root>/<relative_path>``, it
    will be uploaded to ``<web_root>/<relative_path>``.

    If one of the three first parameters is None, the function
    will open a popup windows to ask the missing information.
    See `open_window_params <http://www.xavierdupre.fr/app/pyquickhelper/helpsphinx/pyquickhelper/funcwin/frame_params.html#pyquickhelper.funcwin.frame_params.open_window_params>`_.
    """

    params = {"ftpsite": ftpsite,
              "login": login,
              "password": password}

    nbnone = len([v for k, v in params.items() if v is None or len(v) == 0])
    if nbnone > 0:
        fLOG("retrying to get parameters from users")
        for k, v in sorted(params.items()):
            fLOG("  {0}={1}".format(k, v))
        params = open_window_params(
            params,
            title="Website and Credentials",
            help_string="ftp site + login + password",
            key_save=key_save)

    nbnone = [v for k, v in params.items() if v is None or len(v) == 0]
    if len(nbnone) > 0:
        raise Exception("one of the parameters is None:\n" + str(nbnone))

    password = params["password"]
    login = params["login"]
    ftpsite = params["ftpsite"]

    filter_out = "([/\\\\]((moduletoc.html)|(blogtoc.html)|(searchbox.html)))|([.]buildinfo)"

    ftp = TransferFTP(ftpsite, login, password, fLOG=fLOG)

    for project in docs:

        fLOG("######################################################################")
        for k, v in sorted(project.items()):
            fLOG("  {}={}".format(k, v))

        location = project["local"]
        root_local = project["root_local"]
        root_web = project["root_web"]

        sfile = project["status_file"]
        rootw = project["root_web"]

        # documentation + setup
        fLOG("-------------------------", location)

        ftn = FileTreeNode(root_local)
        fftp = FolderTransferFTP(ftn, ftp, sfile,
                                 root_web=rootw,
                                 fLOG=fLOG,
                                 footer_html=footer_html,
                                 content_filter=content_filter,
                                 is_binary=is_binary,
                                 text_transform=text_transform,
                                 filter_out=filter_out,
                                 force_allow=force_allow)

        fftp.start_transfering()

        ftn = FileTreeNode(os.path.join(root_local, ".."),
                           filter=lambda root, path, f, dir: not dir)
        fftp = FolderTransferFTP(ftn, ftp, sfile,
                                 root_web=root_web.replace(
                                     "helpsphinx", ""),
                                 fLOG=fLOG,
                                 footer_html=footer_html,
                                 content_filter=content_filter,
                                 is_binary=is_binary,
                                 text_transform=text_transform)

        fftp.start_transfering()

    ftp.close()
def publish_teachings_to_web(login, ftpsite="ftp.xavierdupre.fr", google_id=None,
                             location="d:\\jenkins\\pymy\\%s%s\\dist\\%s", rootw="/www/htdocs/app/%s/%s",
                             rootw2="/lesenfantscodaient.fr", folder_status=".",
                             layout=[("html", "helpsphinx")],
                             modules=["pyquickhelper",
                                      "jyquickhelper",
                                      "pyensae",
                                      "pymyinstall",
                                      "pysqllike",
                                      "pyrsslocal",
                                      "pymmails",
                                      "python3_module_template",
                                      "actuariat_python",
                                      "code_beatrix",
                                      "ensae_projects",
                                      "jupytalk",
                                      "mlstatpy",
                                      "teachpyx",
                                      "ensae_teaching_cs"
                                      ],
                             password=None,
                             force_allow=None,
                             suffix=("_UT_35_std",),
                             fLOG=print):
    """
    copy the documentation to the website

    @param      login           login
    @param      ftpsite         ftp site
    @param      google_id       google_id
    @param      location        location of Jenkins build
    @param      rootw           root on ftp site
    @param      rootw2          root for ``lesenfantscodaient.fr``
    @param      folder_status   folder status
    @param      modules         list of modules to publish
    @param      password        if None, if will asked
    @param      layout          last part of the folders
    @param      suffix          suffixes to append to the project name
    @param      force_allow     allow to publish files even if they contain these strings
                                whereas they seem to be credentials
    @param      fLOG            logging function

    Example of use::

        import sys
        import os
        from pyquickhelper.filehelper import TransferFTP, FileTreeNode, FolderTransferFTP
        from pyquickhelper.funcwin import open_window_params
        from ensae_teaching_cs.automation.ftp_publish_helper import publish_teachings_to_web

        login = "******"
        website = "ftp...."
        rootw = "/www/htdocs/app/%s/%s"
        rootw2 = "/lesenfantscodaient.fr"

        password = None

        publish_teachings_to_web(login, ftpsite=website,
            google_id="google_id",
            location="<something>\\\\%s%s\\\\dist\\\\%s",
            rootw=rootw,
            rootw2=rootw2,
            folder_status=os.path.abspath("."),
            password=password)

    """
    import os
    from pyquickhelper.funcwin import open_window_params
    from ensae_teaching_cs.automation.ftp_publish_helper import publish_documentation

    if google_id is None:
        google_id = ""
    else:
        footer = """
        <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
        <script type="text/javascript">
        _uacct = "{}";
        urchinTracker();
        </script>
        """.format(google_id)

    if password is None:
        params = {"password": ""}
        params = open_window_params(
            params, title="password", help_string="password", key_save="my_password")
        password = params["password"]

    location = os.path.abspath(location)
    if folder_status is None:
        folder_status = os.path.abspath(os.path.dirname(__file__))
    else:
        folder_status = os.path.abspath(folder_status)

    if not isinstance(suffix, (tuple, list)):
        suffix = [suffix]

    projects = []
    for module in modules:

        fLOG("+", module, " -- ", layout)

        for lay in layout:
            for suf in suffix:
                root = os.path.abspath(location % (module, suf, lay[0]))
                keepsuf = suf
                if os.path.exists(root):
                    break
            if not os.path.exists(root):
                raise FileNotFoundError(os.path.abspath(
                    location % (module, suffix[0], lay[0])))
            if module != "code_beatrix":
                rw = rootw % (module, lay[1])
            else:
                rw = rootw2

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root, root_local=root, root_web=rw)
            projects.append(project)

        if module == "ensae_teaching_cs":
            lay = [_ for _ in layout if _[0] == "html"][0]
            if not os.path.exists(root):
                raise FileNotFoundError(root)

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root.replace("\\html", "\\html2"),
                           root_local=root.replace("\\html", "\\html2"),
                           root_web=(rootw % (module, lay[1])).replace("_no_clean", "").replace("/helpsphinx", "/helpsphinx2"))
            projects.append(project)

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root.replace("\\html", "\\html3"),
                           root_local=root.replace("\\html", "\\html3"),
                           root_web=(rootw % (module, lay[1])).replace("_no_clean", "").replace("/helpsphinx", "/helpsphinx3"))
            projects.append(project)

            # pres

            for suffix in ["", "_2A", "_3A", "_1Ap"]:
                root = os.path.abspath(location % (module, keepsuf, "html"))
                if not os.path.exists(root):
                    raise FileNotFoundError(root)
                project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                               local=root.replace(
                                   "\\html", "\\html_pres" + suffix),
                               root_local=root.replace(
                                   "\\html", "\\html_pres" + suffix),
                               root_web=(rootw % (module, lay[1])).replace("/helpsphinx", "/pressphinx" + suffix).replace("_no_clean", ""))
                projects.append(project)

        elif module == "python3_module_template":
            lay = [_ for _ in layout if _[0] == "html"][0]
            if not os.path.exists(root):
                raise FileNotFoundError(root)

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root.replace("\\html", "\\html2"),
                           root_local=root.replace("\\html", "\\html2"),
                           root_web=(rootw % (module, lay[1])).replace("_no_clean", "").replace("/helpsphinx", "/helpsphinx2"))
            projects.append(project)

    # publish

    publish_documentation(projects, ftpsite=ftpsite, login=login, password=password,
                          key_save="my_module_password", footer_html=footer,
                          force_allow=force_allow, fLOG=fLOG)
try:
    import pymyinstall
except ImportError:
    sys.path.append(r"../pymyinstall/src")
try:
    import ensae_teaching_cs
except ImportError:
    sys.path.append(r"../ensae_teaching_cs/src")

from pyquickhelper.filehelper import TransferFTP, FileTreeNode, FolderTransferFTP
from pyquickhelper.funcwin import open_window_params
from ensae_teaching_cs.automation.ftp_publish_helper import publish_teachings_to_web

if True:
    params = {"password": "", login: ""}
    params = open_window_params(params, title="password", help_string="password", key_save="my_password")
    password = params["password"]
    login = params["loging"]
else:
    raise NotImplementedError()

publish_teachings_to_web(
    login=login,
    ftpsite="ftp.xavierdupre.fr",
    google_id="UA-2815364-1",
    modules=[
        "pyquickhelper",
        "pyensae",
        "pymyinstall",
        "pysqllike",
        "pyrsslocal",
Пример #4
0
def publish_documentation(docs, ftpsite=None, login=None, password=None,
                          key_save="my_password", footer_html=None, content_filter=trigger_on_specific_strings,
                          is_binary=content_as_binary, force_allow=None, fLOG=print):
    """
    publish the documentation and the setups of a python module on a webiste,
    it assumes the modules is organized the same way as
    `pyquickhelper <http://www.xavierdupre.fr/app/pyquickhelper/helpsphinx/index.html>`_.

    @param      docs            list of dictionaries (see below)
    @param      ftpsite         something like ``ftp.something.``
    @param      login           login
    @param      password        password
    @param      key_save        see function `open_window_params <http://www.xavierdupre.fr/app/pyquickhelper/helpsphinx/pyquickhelper/funcwin/frame_params.html#pyquickhelper.funcwin.frame_params.open_window_params>`_
    @param      footer_html     append this HTML code to any uploaded page (such a javascript code to count the audience)
    @param      content_filter  filter the content of a file (it raises an exception if the result is None),
                                appies only on text files
    @param      is_binary       a function to tell if a content of a file is binary or not
    @param      force_allow     a file is not published if it contains something which looks like credentials
                                except if this string is part of *force_allow*
    @param      fLOG            logging function

    *docs* is a list of dictionaries which must contain for each folder
    to transfer:

    - ``local``: local folder
    - ``root_local``: local paths will be related to this root
    - ``root_web``: prefix to add to the remote paths
    - ``status_file``: a file where the function populates the transfered files and some information about them

    A local file is composed by ``<local_root>/<relative_path>``, it
    will be uploaded to ``<web_root>/<relative_path>``.

    If one of the three first parameters is None, the function
    will open a popup windows to ask the missing information.
    See `open_window_params <http://www.xavierdupre.fr/app/pyquickhelper/helpsphinx/pyquickhelper/funcwin/frame_params.html#pyquickhelper.funcwin.frame_params.open_window_params>`_.
    """

    params = {"ftpsite": ftpsite,
              "login": login,
              "password": password}

    nbnone = len([v for k, v in params.items() if v is None or len(v) == 0])
    if nbnone > 0:
        fLOG("retrying to get parameters from users")
        for k, v in sorted(params.items()):
            fLOG("  {0}={1}".format(k, v))
        params = open_window_params(
            params,
            title="Website and Credentials",
            help_string="ftp site + login + password",
            key_save=key_save)

    nbnone = [v for k, v in params.items() if v is None or len(v) == 0]
    if len(nbnone) > 0:
        raise Exception("one of the parameters is None:\n" + str(nbnone))

    password = params["password"]
    login = params["login"]
    ftpsite = params["ftpsite"]

    filter_out = "[/\\\\]((moduletoc.html)|(blogtoc.html)|(searchbox.html))"

    ftp = TransferFTP(ftpsite, login, password, fLOG=fLOG)

    for project in docs:

        fLOG("######################################################################")
        for k, v in sorted(project.items()):
            fLOG("  {}={}".format(k, v))

        location = project["local"]
        root_local = project["root_local"]
        root_web = project["root_web"]

        sfile = project["status_file"]
        rootw = project["root_web"]

        # documentation + setup
        fLOG("-------------------------", location)

        ftn = FileTreeNode(root_local)
        fftp = FolderTransferFTP(ftn, ftp, sfile,
                                 root_web=rootw,
                                 fLOG=fLOG,
                                 footer_html=footer_html,
                                 content_filter=content_filter,
                                 is_binary=is_binary,
                                 text_transform=text_transform,
                                 filter_out=filter_out,
                                 force_allow=force_allow)

        fftp.start_transfering()

        ftn = FileTreeNode(os.path.join(root_local, ".."),
                           filter=lambda root, path, f, dir: not dir)
        fftp = FolderTransferFTP(ftn, ftp, sfile,
                                 root_web=root_web.replace(
                                     "helpsphinx", ""),
                                 fLOG=fLOG,
                                 footer_html=footer_html,
                                 content_filter=content_filter,
                                 is_binary=is_binary,
                                 text_transform=text_transform)

        fftp.start_transfering()

    ftp.close()
Пример #5
0
def publish_teachings_to_web(login, ftpsite="ftp.xavierdupre.fr", google_id=None,
                             location="d:\\jenkins\\pymy\\%s%s\\dist\\%s", rootw="/www/htdocs/app/%s/%s",
                             rootw2="/lesenfantscodaient.fr", folder_status=".",
                             layout=[("html", "helpsphinx")],
                             modules=["pyquickhelper",
                                      "jyquickhelper",
                                      "pyensae",
                                      "pymyinstall",
                                      "pysqllike",
                                      "pyrsslocal",
                                      "pymmails",
                                      "python3_module_template",
                                      "actuariat_python",
                                      "code_beatrix",
                                      "ensae_projects",
                                      "jupytalk",
                                      "mlstatpy",
                                      "teachpyx",
                                      "ensae_teaching_cs"
                                      ],
                             password=None,
                             force_allow=None,
                             suffix=("_UT_35_std", "_DOC_35_std", ""),
                             fLOG=print):
    """
    copy the documentation to the website

    @param      login           login
    @param      ftpsite         ftp site
    @param      google_id       google_id
    @param      location        location of Jenkins build
    @param      rootw           root on ftp site
    @param      rootw2          root for ``lesenfantscodaient.fr``
    @param      folder_status   folder status
    @param      modules         list of modules to publish
    @param      password        if None, if will asked
    @param      layout          last part of the folders
    @param      suffix          suffixes to append to the project name
    @param      force_allow     allow to publish files even if they contain these strings
                                whereas they seem to be credentials
    @param      fLOG            logging function

    Example of use::

        import sys
        import os
        from pyquickhelper.filehelper import TransferFTP, FileTreeNode, FolderTransferFTP
        from pyquickhelper.funcwin import open_window_params
        from ensae_teaching_cs.automation.ftp_publish_helper import publish_teachings_to_web

        login = "******"
        website = "ftp...."
        rootw = "/www/htdocs/app/%s/%s"
        rootw2 = "/lesenfantscodaient.fr"

        password = None

        publish_teachings_to_web(login, ftpsite=website,
            google_id="google_id",
            location="<something>\\\\%s%s\\\\dist\\\\%s",
            rootw=rootw,
            rootw2=rootw2,
            folder_status=os.path.abspath("."),
            password=password)

    """
    import os
    from pyquickhelper.funcwin import open_window_params
    from ensae_teaching_cs.automation.ftp_publish_helper import publish_documentation

    if google_id is None:
        google_id = ""
    else:
        footer = """
        <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
        <script type="text/javascript">
        _uacct = "{}";
        urchinTracker();
        </script>
        """.format(google_id)

    if password is None:
        params = {"password": ""}
        params = open_window_params(
            params, title="password", help_string="password", key_save="my_password")
        password = params["password"]

    location = os.path.abspath(location)
    if folder_status is None:
        folder_status = os.path.abspath(os.path.dirname(__file__))
    else:
        folder_status = os.path.abspath(folder_status)

    if not isinstance(suffix, (tuple, list)):
        suffix = [suffix]

    projects = []
    for module in modules:

        fLOG("+", module, " -- ", layout)

        for lay in layout:
            for suf in suffix:
                root = os.path.abspath(location % (module, suf, lay[0]))
                keepsuf = suf
                if os.path.exists(root):
                    break
            if not os.path.exists(root):
                raise FileNotFoundError(os.path.abspath(
                    location % (module, suffix[0], lay[0])))
            if module != "code_beatrix":
                rw = rootw % (module, lay[1])
            else:
                rw = rootw2

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root, root_local=root, root_web=rw)
            projects.append(project)

        if module == "ensae_teaching_cs":
            lay = [_ for _ in layout if _[0] == "html"][0]
            if not os.path.exists(root):
                raise FileNotFoundError(root)

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root.replace("\\html", "\\html2"),
                           root_local=root.replace("\\html", "\\html2"),
                           root_web=(rootw % (module, lay[1])).replace("_no_clean", "").replace("/helpsphinx", "/helpsphinx2"))
            projects.append(project)

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root.replace("\\html", "\\html3"),
                           root_local=root.replace("\\html", "\\html3"),
                           root_web=(rootw % (module, lay[1])).replace("_no_clean", "").replace("/helpsphinx", "/helpsphinx3"))
            projects.append(project)

            # pres

            for suffix in ["", "_2A", "_3A", "_1Ap"]:
                root = os.path.abspath(location % (module, keepsuf, "html"))
                if not os.path.exists(root):
                    raise FileNotFoundError(root)
                project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                               local=root.replace(
                                   "\\html", "\\html_pres" + suffix),
                               root_local=root.replace(
                                   "\\html", "\\html_pres" + suffix),
                               root_web=(rootw % (module, lay[1])).replace("/helpsphinx", "/pressphinx" + suffix).replace("_no_clean", ""))
                projects.append(project)

        elif module == "python3_module_template":
            lay = [_ for _ in layout if _[0] == "html"][0]
            if not os.path.exists(root):
                raise FileNotFoundError(root)

            project = dict(status_file=os.path.join(folder_status, "status_%s.txt" % module),
                           local=root.replace("\\html", "\\html2"),
                           root_local=root.replace("\\html", "\\html2"),
                           root_web=(rootw % (module, lay[1])).replace("_no_clean", "").replace("/helpsphinx", "/helpsphinx2"))
            projects.append(project)

    # publish

    publish_documentation(projects, ftpsite=ftpsite, login=login, password=password,
                          key_save="my_module_password", footer_html=footer,
                          force_allow=force_allow, fLOG=fLOG)
    import pymyinstall
except ImportError:
    sys.path.append(r"../pymyinstall/src")
try:
    import ensae_teaching_cs
except ImportError:
    sys.path.append(r"../ensae_teaching_cs/src")

from pyquickhelper.filehelper import TransferFTP, FileTreeNode, FolderTransferFTP
from pyquickhelper.funcwin import open_window_params
from ensae_teaching_cs.automation.ftp_publish_helper import publish_teachings_to_web

if True:
    params = {"password": "", login: ""}
    params = open_window_params(params,
                                title="password",
                                help_string="password",
                                key_save="my_password")
    password = params["password"]
    login = params["loging"]
else:
    raise NotImplementedError()

publish_teachings_to_web(login=login,
                         ftpsite="ftp.xavierdupre.fr",
                         google_id="UA-2815364-1",
                         modules=[
                             "pyquickhelper", "pyensae", "pymyinstall",
                             "pysqllike", "pyrsslocal", "pymmails",
                             "python3_module_template", "actuariat_python",
                             "code_beatrix", "ensae_projects", "jupytalk",
                             "mlstatpy", "ensae_teaching_cs"