{ "info": { "author": "Oleksandr Polieno", "author_email": "polyenoom@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "C2P2 - Simple markdown pages publisher\n======================================\n\n**C**\\ ode\n**C**\\ ommit\n**P**\\ ush\n**P**\\ ublish\n\nInstallation\n------------\n\n.. code-block:: bash\n\n pip install c2p2\n\nor\n\n.. code-block:: bash\n\n pip install git+https://github.com/nanvel/c2p2.git\n\nUsage\n-----\n\nFork c2p2_template\n~~~~~~~~~~~~~~~~~~\n\nThe easiest way to start is to fork this template: https://github.com/nanvel/c2p2-template.\n\nTemplates API\n~~~~~~~~~~~~~\n\nThe application looks for templates inside SOURCE_FOLDER, so we need to add them.\nMinimal list of files required is:\n\n.. code-block:: text\n\n - site\n - engine\n - templates\n - 404.html\n - 500.html\n - index.html\n - page.html\n - label.html\n - sitemap.xml\n\n``index.html``, ``page.html``, ``label.html`` and ``sitemap.xml`` receives, beside `tornado standart template context `__, \nvariable ``c``, that uses to access list of pages and labels, for example:\n\n.. code-block:: django\n\n {{ c.page }}\n {{ c.page.title }}\n {{ c.page.labels }}\n {{ c.label }}\n {% for page in c.pages %}\n {{ c.pages[''] }}\n {{ c.pages.for_label('') }}\n\n``c.page`` is available only in ``page.html``.\nIt returns current page object.\n\n``Page`` object has next attributes:\n - uri\n - html\n - created\n - modified\n - title\n - meta\n - labels\n\n``page.meta`` returns ``PageMeta`` object, where all variables specified in the top of the page is available.\n\n.. code-block:: text\n\n // page.md\n created: 2015-10-10T00:00\n show_comments: true\n labels: Label1\n Label2\n\n.. code-block:: django\n\n // page.html\n {{ c.page.meta.created }} -> '2015-10-10T00:00'\n {{ c.page.meta.created }} -> '2015-10-10T00:00'\n {{ c.page.meta.labels }} -> 'Label1'\n {{ c.page.meta.get('labels') }} -> 'Label1'\n {{ c.page.meta.get_list('labels') }} -> ['Label1', 'Label2']\n {{ c.page.meta.show_comments }} -> true\n {{ c.page.meta.not_exist }} -> None\n\n``page.labels`` returns list of Label objects connected to the page:\n\n.. code-block:: django\n\n {% for label in c.page.labels %}{{ label.title }}{% end %}\n\n``Label`` object has next attributes:\n - title\n - slug\n\n``c.pages`` returns an iterable that allows to get all pages list. In ``label.html`` it return only pages belong to the label.\nYou also can get any page by uri using ``c.pages``.\n\n.. code-block:: django\n\n {% for page in c.pages %}{{ page.title }}{% end %}\n\n {{ c.pages['2010/09/blog-post'].html }}\n\n {{ c.pages.for_label('default') }}\n\nRunning the server\n~~~~~~~~~~~~~~~~~~\n\nTo run the application use ``site/engine/app.py``:\n\n.. code-block:: python\n\n import os.path\n\n from c2p2 import app\n from c2p2.settings import settings\n\n\n rel = lambda p: os.path.join(os.path.dirname(os.path.realpath(__file__)), p)\n\n\n if __name__ == '__main__':\n settings.SOURCE_FOLDER = rel('..')\n app.run()\n\nSettings\n--------\n\nThere are 4 ways to set settings:\n - default settings (see ``c2p2/settings.py``)\n - environment variables with ``C2P2_`` prefix: ``export C2P2_PORT=5000``\n - command line arguments (``app.py --PORT=5000``)\n - also you can change them directly ``settings.PORT = 5000`` in ``site/engine/app.py`` \n\nAvailable settings:\n - ``DEBUG``: Enable tornado debug mode\n - ``PORT``: Port the app listening to\n - ``SOURCE_FOLDER``: Path to folder that contains pages source\n - ``UPDATE_TIMEOUT``: Number of seconds to rescan source folder. 0 - disable\n - ``GITHUB_VALIDATE_IP``: Enable GitHub ip validation\n - ``GITHUB_SECRET``: GitHub web hook secret, optional\n - ``GITHUB_BRANCH``: GitHub branch to watch\n\nQuestions and Answers\n---------------------\n\nRun on work station\n~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: bash\n\n cd site\n virtualenv venv --no-site-packages -p /usr/local/bin/python3.5\n source venv/bin/activate\n pip install c2p2\n python engine/app.py\n\nOpen ``http://localhost:5000`` in browser.\n\nUpdate site if md file was changed without server restart\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUse UPDATE_TIMEOUT setting.\n\nUpdate site on GitHub push\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCreate new GitHub hook for your repository:\n - url: ``http://mysite.com/pull``\n - secret: should be equal to GITHUB_SECRET setting value\n\nProduction configuration\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nSettings:\n - DEBUG=false\n - UPDATE_TIMEOUT=0\n - GITHUB_VALIDATE_IP=true\n - GITHUB_SECRET=\n - GITHUB_BRANCH=master\n\nSupervisor configuration:\n\n.. code-block:: text\n\n [program:mysite]\n process_name=mysite\n directory=/home/deploy/mysite\n environment=C2P2_PORT=5100,C2P2_DEBUG=false,C2P2_UPDATE_TIMEOUT=0,C2P2_GITHUB_VALIDATE_ID=true,C2P2_GIHUB_SECRET=123xyz,C2P2_GITHUB_BRANCH=master\n command=/home/deploy/mysite/venv/bin/python engine/app.py\n user=deploy\n stdout_logfile=/var/log/mysite/out.log\n stderr_logfile=/var/log/mysite/err.log\n autostart=true\n autorestart=true\n\nNginx configuration:\n\n.. code-block:: nginx\n\n upstream mysite {\n server 127.0.0.1:5100;\n }\n\n server {\n listen 80;\n\n # If you need to restrict access\n # auth_basic \"Restricted\";\n # auth_basic_user_file /etc/nginx/.htpasswd;\n\n server_name mysite.com;\n\n location / {\n proxy_cache off;\n proxy_pass http://mysite;\n }\n\n location ~* \\.(?:css|png|jpe?g|gif|ico|zip|txt)$ {\n root /home/deploy/mysite;\n log_not_found off;\n }\n\n error_page 500 502 503 504 /home/deploy/mysite/engine/templates/500.html;\n error_page 400 402 403 404 /home/deploy/mysite/engine/templates/400.html;\n }\n\nFavicon and robots.txt\n~~~~~~~~~~~~~~~~~~~~~~\n\nJust add favicon.ico and robots.txt to root folder of your site.\n\nCustom md directives\n~~~~~~~~~~~~~~~~~~~~\n\nIt is possible to register custom md directives:\n\n.. code-block:: python\n\n from c2p2.utils import ExtensionsRegistry\n\n ExtensionsRegistry.register(extension=MyExtension)\n\nEdit on GitHub link\n~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: django\n\n Edit on GitHub\n\nTests\n-----\n\n.. code-block:: bash\n\n python -m unittest c2p2.tests\n\nContribute\n----------\n\nIf you want to contribute to this project, please perform the following steps:\n\n.. code-block:: bash\n\n # Fork this repository\n $ virtualenv .env --no-site-packages -p /usr/local/bin/python3.5\n $ source .env/bin/activate\n $ python setup.py install\n $ pip install -r requirements.txt\n\n $ git branch feature_branch master\n # Implement your feature and tests\n $ git add . && git commit\n $ git push -u origin feature_branch\n # Send me a pull request for your feature branch", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nanvel/c2p2", "keywords": "tornado,github,blog,publish", "license": "The MIT License", "maintainer": null, "maintainer_email": null, "name": "c2p2", "package_url": "https://pypi.org/project/c2p2/", "platform": "OS Independent", "project_url": "https://pypi.org/project/c2p2/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/nanvel/c2p2" }, "release_url": "https://pypi.org/project/c2p2/0.1.2/", "requires_dist": null, "requires_python": null, "summary": "Code Commit Push Publish engine.", "version": "0.1.2" }, "last_serial": 2112578, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "ead9ec5044693848f1f17b9215d780d3", "sha256": "dd5dc048f4ffb6372ca5c7b906e4963bc9319655909a9f23954f80d9b73286e7" }, "downloads": -1, "filename": "c2p2-0.0.1.tar.gz", "has_sig": false, "md5_digest": "ead9ec5044693848f1f17b9215d780d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6575, "upload_time": "2015-11-08T15:13:50", "url": "https://files.pythonhosted.org/packages/62/71/56f95db4449f71356203044323af2d30f544b2ca6f1408d5d5a9f10dd3cb/c2p2-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "d23ba43f8c3a76ce46f04a5a3798ce9d", "sha256": "19e56843f8c6925906d5d7fc44283254fc5bbf84d26f905ffb28ee03dc9ddd17" }, "downloads": -1, "filename": "c2p2-0.0.2.tar.gz", "has_sig": false, "md5_digest": "d23ba43f8c3a76ce46f04a5a3798ce9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7674, "upload_time": "2015-11-08T15:25:04", "url": "https://files.pythonhosted.org/packages/49/0e/8d3a09f28ae0be19b9eb74c312b70d84df5d4542ceda7f028b07aae451bf/c2p2-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "f8a89773ece040486e347695bf04c3da", "sha256": "6fef3be6950b87c3361cdb8e7f6ef77f65c758db5d70308ef8bee1388c8e9add" }, "downloads": -1, "filename": "c2p2-0.0.3.tar.gz", "has_sig": false, "md5_digest": "f8a89773ece040486e347695bf04c3da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7616, "upload_time": "2015-11-08T15:38:12", "url": "https://files.pythonhosted.org/packages/5d/29/547777ba965536f2f460e16bf37cd830f2d8441405b400c2b6fe7a7cbe0c/c2p2-0.0.3.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "ff14bb3c3fcb0fc9dbcf4787421a659a", "sha256": "18e9672c0e2abd321e3d0cda2e50a0df36a7ebf0a001260574656f7b3f5982ae" }, "downloads": -1, "filename": "c2p2-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ff14bb3c3fcb0fc9dbcf4787421a659a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10969, "upload_time": "2015-11-22T15:31:31", "url": "https://files.pythonhosted.org/packages/ba/fd/26919d6ab653d7faa9969201219d91ffe285643ac2befdffd8bcb4bc63db/c2p2-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "08eae7a4afb3c0c3864e673cf9de2ef1", "sha256": "041b40fa1848a0fdebc6379c65d956799fdbc0036703874e0c6de34bf98f4381" }, "downloads": -1, "filename": "c2p2-0.1.1.tar.gz", "has_sig": false, "md5_digest": "08eae7a4afb3c0c3864e673cf9de2ef1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10955, "upload_time": "2015-11-22T16:00:19", "url": "https://files.pythonhosted.org/packages/db/c3/ac19945b3099dd9b9587bfc6d626a0085b5b7a9d26a9069e0fdad363f7c6/c2p2-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "167bca63ed5a83e7288740f34e0e43c6", "sha256": "7b1885a2d0d7fbf592c31dde1a7b8d8a1311e52f232a72ead72008b0a0b9e9d7" }, "downloads": -1, "filename": "c2p2-0.1.2.tar.gz", "has_sig": false, "md5_digest": "167bca63ed5a83e7288740f34e0e43c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10853, "upload_time": "2016-05-12T14:13:31", "url": "https://files.pythonhosted.org/packages/82/5a/b068bdba360ec6cf6649eb4267b6258f00e24d8a3369ca37c330d57d0ee0/c2p2-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "167bca63ed5a83e7288740f34e0e43c6", "sha256": "7b1885a2d0d7fbf592c31dde1a7b8d8a1311e52f232a72ead72008b0a0b9e9d7" }, "downloads": -1, "filename": "c2p2-0.1.2.tar.gz", "has_sig": false, "md5_digest": "167bca63ed5a83e7288740f34e0e43c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10853, "upload_time": "2016-05-12T14:13:31", "url": "https://files.pythonhosted.org/packages/82/5a/b068bdba360ec6cf6649eb4267b6258f00e24d8a3369ca37c330d57d0ee0/c2p2-0.1.2.tar.gz" } ] }