{
"info": {
"author": "Denis Drescher",
"author_email": "denis.drescher+resyndicator@claviger.net",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Natural Language :: English",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: Implementation :: CPython"
],
"description": "Resyndicator\n============\n\nThis documentation is best viewed on https://resyndicator.readthedocs.io/.\n\nPurpose\n-------\n\nThe Resyndicator is a Python 3 framework for aggregating data from various\nsources into Atom feeds. If you have a list of a couple hundred data\nsources \u2013 such as feeds, sitemaps, and Twitter users \u2013 and want to share the aggregate of those\nentries between your various devices (computers, phones, etc.), your\ncolleagues, or even the visitors of your website, then that\u2019s just what\nthe Resyndicator is for.\n\n- It can obtain data from feeds, sitemaps, social media, and any other sources you implement.\n- It allows for queries as sophisticated as SQLAlchemy allows to filter\n your aggregate feed.\n- It allows you to subclass the fetchers easily, so you can write fetchers for\n endpoints as obscure as Adobe\u2019s AMF.\n- It keeps all entries in Postgres, so you have a backup.\n\nI\u2019ve been using the Resyndicator for the `EA Foundation `_, `.impact `_, `Saram `_, `Derpy News `_, and `Ferret Go `_, and a marketing department of Logitech also indicated interest at one point.\n\nSetup\n-----\n\nI\u2019ve created a `sample implementation `_ of the Resyndicator framework to facilitate the setup process. You can fork it and adapt it for your purposes. (I\u2019ve been following the convention of calling my implementations \u201csoandsofeeder\u201d \u2013 a word ending in \u201cfeeder\u201d with no hyphen or space in between.) The `Resyndicator is hosted on PyPI `_, so you can just install it through pip.\n\n- One important file is `samplefeeder/settings.py `_ with some general settings. For the defaults see `resyndicator/settings.py `_.\n- The other is `samplefeeder/resources.py `_.\n\nSettings\n~~~~~~~~\n\nIn ``settings.py``, you\u2019ll in particular need to change your database credentials with something like\n``DATABASE = 'postgresql://foo:bar@localhost/samplefeeder'`` (you may\nneed to create the database and grant access rights to the user). I haven\u2019t tested it with anything other than Postgres.\n\nFor\nmore options, see `resyndicator/settings.py `_.\n\nNote: You can create the database like so::\n\n create role samplefeeder with password 'samplefeeder' login;\n create database samplefeeder with owner samplefeeder;\n\nMy system automatically creates it with UTF-8 encoding, but some Debian systems package a version of\nPostgres that uses some weird encoding by default. In that case make sure to inherit from the right template.\n\n::\n\n postgres=# \\l\n List of databases\n Name | Owner | Encoding | Collate | Ctype | Access privileges\n --------------------------+----------------+-----------+-------------+-------------+-------------------------------\n postgres | postgres | UTF8 | en_DK.UTF-8 | en_DK.UTF-8 |\n samplefeeder | samplefeeder | UTF8 | en_DK.UTF-8 | en_DK.UTF-8 |\n\n\nResources\n~~~~~~~~~\n\nIn ``resources.py``, you list the feeds and (eponymous) resyndicators\nlike so for example::\n\n from datetime import timedelta\n from sqlalchemy.sql import or_\n from resyndicator import settings\n from resyndicator.models import Entry\n from resyndicator.fetchers import (\n FeedFetcher, SitemapIndexFetcher, SitemapFetcher,\n TwitterFetcher, ContentFetcher)\n from resyndicator.resyndicators import Resyndicator\n from . import settings\n\n CONTENT_FETCHERS = [\n ContentFetcher(past=settings.PAST, timeout=10)\n ]\n\n RESYNDICATORS = [\n Resyndicator(\n title='Effective Altruism',\n past=PAST,\n query=or_(\n Entry.source_link.in_([\n 'http://feeds.feedburner.com/TheGivewellBlog',\n 'http://www.openphilanthropy.org/sitemap.xml',\n ])\n )\n )\n ]\n\n FETCHERS = [\n FeedFetcher('http://feeds.feedburner.com/TheGivewellBlog',\n interval=10*60),\n SitemapFetcher('http://www.openphilanthropy.org/sitemap.xml',\n defaults={'title': 'Open Phil Sitemap',\n 'author': 'Open Philanthropy Project'},\n interval=30*60),\n ]\n\n STREAMS = [\n TwitterFetcher(\n oauth_token=settings.OAUTH_TOKEN,\n oauth_secret=settings.OAUTH_SECRET,\n interval=5*60),\n ]\n\nSamplefeeder contains a working sample ``resources.py`` that you can adapt. It is missing the\nsample TwitterFetcher so it does not expose the OAuth secret.\n\nFor each resyndicator, you define a query and a title which will\ndetermine its ID and thus its identity. If you change the title you\ncreate a new, different feed. The query determines the entries of the feed and\nis specified as `SQLAlchemy where statements `_.\n\nTo build your Samplefeeder fork, run `make`.\n\nRunning It\n----------\n\nYou can check the `supervisord.conf `_ that is includede with the Samplefeeder for sample invocations.\n\nNote: The Resyndicator requires Python 3 (and I haven\u2019t tested it with versions older than Python 3.4) while Supervisor will only support Python 3 upon version 4.0, so you\u2019ll need two different Pythons to run it this way. (But it\u2019s no problem to run a Python 3 application through Supervisor.)\n\n::\n\n [program:fetcher]\n command = bin/resyndicator -s samplefeeder.settings fetchers\n ...\n\n [program:content]\n command = bin/resyndicator -s samplefeeder.settings content\n ...\n\nYou can use ``bin/resyndicator -s samplefeeder.settings fetchers --test-mode`` to instruct the Resyndicator to ignore the intervals and fetche all feeds immediately so you don\u2019t have to wait to see if any of them malfunction.\n\nServing the Feeds\n-----------------\n\nThe feeds are written to files in the `webroot/` subdirectory. Point your Nginx or Varnish at this\ndirectory to serve the feeds. An Nginx example::\n\n server {\n listen 80;\n listen [::]:80;\n server_name feeds.example.com;\n\n charset utf-8;\n keepalive_timeout 5;\n root /opt/samplefeeder/webroot/;\n access_log /var/log/nginx/feeds.access.log main;\n }\n\nTesting\n-------\n\nYou can run use pytest to run the tests:\n\n1. ``make`` to install the virtualenv with the Resyndicator and dependencies\n2. ``bin/pip install pytest``\n3. ``bin/py.test resyndicator``",
"description_content_type": null,
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://bitbucket.org/Telofy/resyndicator",
"keywords": "",
"license": "Apache 2.0",
"maintainer": "",
"maintainer_email": "",
"name": "resyndicator",
"package_url": "https://pypi.org/project/resyndicator/",
"platform": "",
"project_url": "https://pypi.org/project/resyndicator/",
"project_urls": {
"Homepage": "https://bitbucket.org/Telofy/resyndicator"
},
"release_url": "https://pypi.org/project/resyndicator/0.8.2/",
"requires_dist": null,
"requires_python": "",
"summary": "Aggregates data from many sources into merged and filtered Atom feeds.",
"version": "0.8.2"
},
"last_serial": 2931718,
"releases": {
"0.1.1": [
{
"comment_text": "",
"digests": {
"md5": "f9b40dd633e6e8ab6e904306738ef618",
"sha256": "a2aa05a499c50f856efc04237b2a4937c8be9b87ac4ff70566e1887525e817eb"
},
"downloads": -1,
"filename": "resyndicator-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "f9b40dd633e6e8ab6e904306738ef618",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14005,
"upload_time": "2016-05-20T13:32:28",
"url": "https://files.pythonhosted.org/packages/3d/be/895264dccbbfa29b8a2b044d20c8cfc1ed2fffb372a3527f89e038d5db63/resyndicator-0.1.1.tar.gz"
}
],
"0.1.2": [
{
"comment_text": "",
"digests": {
"md5": "6935bdfcd08a993d856b96613a5a33db",
"sha256": "3ca4ef01398c14b6919d1dc6614dea1c65c497d0c850bb67deb0a6157a2f2348"
},
"downloads": -1,
"filename": "resyndicator-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "6935bdfcd08a993d856b96613a5a33db",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 12366,
"upload_time": "2016-05-20T18:00:26",
"url": "https://files.pythonhosted.org/packages/0b/a7/9b874a867c398428804be76b77e954981fa7995cc52e8c45e60c3bd96980/resyndicator-0.1.2.tar.gz"
}
],
"0.1.3": [
{
"comment_text": "",
"digests": {
"md5": "01fc6b2122016b1b52235288941c95ec",
"sha256": "bf58303bfe1906314ff974e84c18705f9f1356dcd11571596f2454826636a0a6"
},
"downloads": -1,
"filename": "resyndicator-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "01fc6b2122016b1b52235288941c95ec",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 12392,
"upload_time": "2016-05-23T17:51:04",
"url": "https://files.pythonhosted.org/packages/e7/07/9cc5075a0a7ee12268a5e4e45e8963466ec50c6144e67fd7473a337c7db2/resyndicator-0.1.3.tar.gz"
}
],
"0.1.4": [
{
"comment_text": "",
"digests": {
"md5": "2d4b45174df5f7f94abb206617b59ea4",
"sha256": "1f0295792f8f78426dcc73699368d8eb8fb5a8d6fcbe18c9a9105d61ccdeb9bb"
},
"downloads": -1,
"filename": "resyndicator-0.1.4.tar.gz",
"has_sig": false,
"md5_digest": "2d4b45174df5f7f94abb206617b59ea4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 12445,
"upload_time": "2016-05-24T08:18:25",
"url": "https://files.pythonhosted.org/packages/38/34/d59fdd0bd0db0d2049a762339cb8172374a0543b6d975132bd70fcb268e5/resyndicator-0.1.4.tar.gz"
}
],
"0.2.1": [
{
"comment_text": "",
"digests": {
"md5": "ecc47a2583fbe4f6bf96c63daaeff8c0",
"sha256": "acab753876f7811c5116eed8fb6c97cab9c60ee8a1fe63d7c02d36ce84c05c00"
},
"downloads": -1,
"filename": "resyndicator-0.2.1.tar.gz",
"has_sig": false,
"md5_digest": "ecc47a2583fbe4f6bf96c63daaeff8c0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 12867,
"upload_time": "2017-01-06T13:34:00",
"url": "https://files.pythonhosted.org/packages/ff/25/3ee32c6e91bc7e264794aebcaac6c42ad0215da3f43713b6852e173bbc65/resyndicator-0.2.1.tar.gz"
}
],
"0.5.0": [
{
"comment_text": "",
"digests": {
"md5": "b0c24791ee3046e9c2a52061ab678f24",
"sha256": "bc2636fbc2c09d7cc3e79287ce6eadb95b5b62eb79754903aa1847822d899ca3"
},
"downloads": -1,
"filename": "resyndicator-0.5.0.tar.gz",
"has_sig": false,
"md5_digest": "b0c24791ee3046e9c2a52061ab678f24",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13338,
"upload_time": "2017-05-16T14:49:27",
"url": "https://files.pythonhosted.org/packages/42/00/eb0cb741cd1938616f4365d1abef6ea78ed2ffde2d164d9d68016d227985/resyndicator-0.5.0.tar.gz"
}
],
"0.5.1": [
{
"comment_text": "",
"digests": {
"md5": "a843f2aca22e88f6b61cb98d81d041e9",
"sha256": "6b925a7b954ad004fc624317ae9ac57e94e664d14d65cda09a381d23d70aa992"
},
"downloads": -1,
"filename": "resyndicator-0.5.1.tar.gz",
"has_sig": false,
"md5_digest": "a843f2aca22e88f6b61cb98d81d041e9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13149,
"upload_time": "2017-05-16T16:37:12",
"url": "https://files.pythonhosted.org/packages/02/bb/5b4ecbc36e08cd4b91a7b8a1edde4422268384812830f37bf21d94134e4f/resyndicator-0.5.1.tar.gz"
}
],
"0.5.2": [
{
"comment_text": "",
"digests": {
"md5": "1314bded5b9623b3fb8bcbaba520eb6a",
"sha256": "2f41f5743d1922f50508b7f280dde14751ee02150bbe15a596384e71146422da"
},
"downloads": -1,
"filename": "resyndicator-0.5.2.tar.gz",
"has_sig": false,
"md5_digest": "1314bded5b9623b3fb8bcbaba520eb6a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14960,
"upload_time": "2017-05-20T00:26:57",
"url": "https://files.pythonhosted.org/packages/3f/19/82162cba017e8feed5bad8c6712dfb1278d0704e1b0f5bc89efe79eb4a14/resyndicator-0.5.2.tar.gz"
}
],
"0.5.3": [
{
"comment_text": "",
"digests": {
"md5": "4721e840ac99435ff985f84850ee3e56",
"sha256": "e9b0bb1f06ecbfd4037cd90afe8546ef81de36c2aa4e774d201899e011a3e044"
},
"downloads": -1,
"filename": "resyndicator-0.5.3.tar.gz",
"has_sig": false,
"md5_digest": "4721e840ac99435ff985f84850ee3e56",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14956,
"upload_time": "2017-05-20T00:34:14",
"url": "https://files.pythonhosted.org/packages/f9/b6/96d765196631b924460c48a7f5cbe4768acbff9df8a2deb419415445da91/resyndicator-0.5.3.tar.gz"
}
],
"0.5.4": [
{
"comment_text": "",
"digests": {
"md5": "6f748ff835261b55aa56e531e57840b0",
"sha256": "c0026392b61045d79d4bfbccc206cbdb3cf6922a3e3bafa0a8198540f6f8bca8"
},
"downloads": -1,
"filename": "resyndicator-0.5.4.tar.gz",
"has_sig": false,
"md5_digest": "6f748ff835261b55aa56e531e57840b0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 15357,
"upload_time": "2017-05-20T00:41:53",
"url": "https://files.pythonhosted.org/packages/87/4d/41cf853c85439aa080bf4305a97b5872417570423c94f6c8771926b5db7b/resyndicator-0.5.4.tar.gz"
}
],
"0.6.0": [
{
"comment_text": "",
"digests": {
"md5": "bdf64b5c62540c9097d3b184738b1914",
"sha256": "edb4f676f7fb90d22a127af723f5ff3d35eabe9eb9bbe73402fec28000e011ba"
},
"downloads": -1,
"filename": "resyndicator-0.6.0.tar.gz",
"has_sig": false,
"md5_digest": "bdf64b5c62540c9097d3b184738b1914",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25418,
"upload_time": "2017-06-02T05:23:26",
"url": "https://files.pythonhosted.org/packages/da/23/dad05637bcec0f05423acf9d0f120d34df47b5564dbcad3eb4e6967c4f4b/resyndicator-0.6.0.tar.gz"
}
],
"0.7.0": [
{
"comment_text": "",
"digests": {
"md5": "0076ccd31a5554e47679a6616cfe02c9",
"sha256": "e4eb7a6d89f7a76a06ee3d3f2427c7658d3acb0b3ee806eef34a09c35a7b592c"
},
"downloads": -1,
"filename": "resyndicator-0.7.0.tar.gz",
"has_sig": false,
"md5_digest": "0076ccd31a5554e47679a6616cfe02c9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26477,
"upload_time": "2017-06-02T12:16:33",
"url": "https://files.pythonhosted.org/packages/c2/1b/f90a6dd2b6479c37fc6982d0cd45f32d70a0b9c4e6de4e6bfd757faf39d2/resyndicator-0.7.0.tar.gz"
}
],
"0.7.1": [
{
"comment_text": "",
"digests": {
"md5": "6d01e5ef5f193d1176639becebd94d9f",
"sha256": "6565edeaeb0bbf7506df6124596fe9e1ccf06db8769f53d37ac64e6722ef59d6"
},
"downloads": -1,
"filename": "resyndicator-0.7.1.tar.gz",
"has_sig": false,
"md5_digest": "6d01e5ef5f193d1176639becebd94d9f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26603,
"upload_time": "2017-06-03T07:58:59",
"url": "https://files.pythonhosted.org/packages/4a/0c/b4712f8b5a73536c0839d46bcb09cfddf7a13ff05ba61860dc071e822b19/resyndicator-0.7.1.tar.gz"
}
],
"0.8.0": [
{
"comment_text": "",
"digests": {
"md5": "f1061df85a30480a514692aa7267934b",
"sha256": "4b831dad06cdfc3337c6021b67f9ebc73e5d109dfe30a1bc1b7ac735babb5170"
},
"downloads": -1,
"filename": "resyndicator-0.8.0.tar.gz",
"has_sig": false,
"md5_digest": "f1061df85a30480a514692aa7267934b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26802,
"upload_time": "2017-06-03T11:05:04",
"url": "https://files.pythonhosted.org/packages/15/b6/c5330f26540644bb827f02829e9ba4624ff1417edfc984cda7cc85eaccf7/resyndicator-0.8.0.tar.gz"
}
],
"0.8.1": [
{
"comment_text": "",
"digests": {
"md5": "aaadd81dd80e620c18db4f360fd7b5c4",
"sha256": "829a75236921e2690ec846fa9ccdef06c3c80d2f88542393a4cd22fb31715621"
},
"downloads": -1,
"filename": "resyndicator-0.8.1.tar.gz",
"has_sig": false,
"md5_digest": "aaadd81dd80e620c18db4f360fd7b5c4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26923,
"upload_time": "2017-06-03T17:16:01",
"url": "https://files.pythonhosted.org/packages/6b/31/8bd5817c94350930d8ac5d34a87094c223586bd2b96bd5cb6464fbfdd3ed/resyndicator-0.8.1.tar.gz"
}
],
"0.8.2": [
{
"comment_text": "",
"digests": {
"md5": "d6b5bb3d1b3d91c6ab351a3f7c6f7864",
"sha256": "fd6e0c3c3a33f10241fd7bf6d04d7a338439a4429fb3e316d4e45b9f3f1cb184"
},
"downloads": -1,
"filename": "resyndicator-0.8.2.tar.gz",
"has_sig": false,
"md5_digest": "d6b5bb3d1b3d91c6ab351a3f7c6f7864",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27124,
"upload_time": "2017-06-07T10:08:54",
"url": "https://files.pythonhosted.org/packages/f7/ef/94ce49d942ac56950e82c6583cd2b63786dc02b5739898361ebf4a4bf371/resyndicator-0.8.2.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "d6b5bb3d1b3d91c6ab351a3f7c6f7864",
"sha256": "fd6e0c3c3a33f10241fd7bf6d04d7a338439a4429fb3e316d4e45b9f3f1cb184"
},
"downloads": -1,
"filename": "resyndicator-0.8.2.tar.gz",
"has_sig": false,
"md5_digest": "d6b5bb3d1b3d91c6ab351a3f7c6f7864",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27124,
"upload_time": "2017-06-07T10:08:54",
"url": "https://files.pythonhosted.org/packages/f7/ef/94ce49d942ac56950e82c6583cd2b63786dc02b5739898361ebf4a4bf371/resyndicator-0.8.2.tar.gz"
}
]
}