From c6c0ee76c2d47017a56ef8442d8616e2dd2fb9d7 Mon Sep 17 00:00:00 2001 From: Marco Milanesi Date: Tue, 6 Sep 2011 18:54:41 +0200 Subject: [PATCH 1/5] implemented github activity plugin --- pelican/plugins/github_activity.py | 27 +++++++++++++++++++++++++++ pelican/signals.py | 1 + pelican/utils.py | 12 ++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 pelican/plugins/github_activity.py diff --git a/pelican/plugins/github_activity.py b/pelican/plugins/github_activity.py new file mode 100644 index 00000000..d279e616 --- /dev/null +++ b/pelican/plugins/github_activity.py @@ -0,0 +1,27 @@ +from pelican import signals +from pelican.utils import singleton + +@singleton +class GitHubActivity(): + def __init__(self, generator): + try: + import feedparser + self.ga = feedparser.parse( + generator.settings['GITHUB_ACTIVITY_FEED']) + except ImportError: + raise Exception("unable to find feedparser") + + def fetch(self): + return [activity['content'][0]['value'].strip() + for activity in self.ga['entries']] + +def add_github_activity(generator, metadata): + if 'GITHUB_ACTIVITY_FEED' in generator.settings.keys(): + + ga = GitHubActivity(generator) + + ga_html_snippets = ga.fetch() + generator.context['github_activity'] = ga_html_snippets + +def register(): + signals.article_generate_context.connect(add_github_activity) diff --git a/pelican/signals.py b/pelican/signals.py index f2bf4547..fb50252f 100644 --- a/pelican/signals.py +++ b/pelican/signals.py @@ -2,3 +2,4 @@ from blinker import signal initialized = signal('pelican_initialized') article_generate_context = signal('article_generate_context') +github_activity = signal('github_activity') diff --git a/pelican/utils.py b/pelican/utils.py index 8e48c2e9..a67836ca 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -222,3 +222,15 @@ def files_changed(path, extensions): LAST_MTIME = mtime return True return False + +def singleton(cls): + """ + Singleton decorator for multiple calls inside plugins + for an example see pelican/plugins/github_activity.py + """ + instances = {} + def getinstance(*args, **kwargs): + if cls not in instances: + instances[cls] = cls(*args, **kwargs) + return instances[cls] + return getinstance From 3743617d27f5ec5216432636433dc566a7f802c1 Mon Sep 17 00:00:00 2001 From: Marco Milanesi Date: Tue, 6 Sep 2011 18:56:44 +0200 Subject: [PATCH 2/5] removed spurious signal --- pelican/signals.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pelican/signals.py b/pelican/signals.py index fb50252f..f2bf4547 100644 --- a/pelican/signals.py +++ b/pelican/signals.py @@ -2,4 +2,3 @@ from blinker import signal initialized = signal('pelican_initialized') article_generate_context = signal('article_generate_context') -github_activity = signal('github_activity') From 575905ac53f1af696045f68e0ac469ecd2a2ba9a Mon Sep 17 00:00:00 2001 From: Marco Milanesi Date: Tue, 6 Sep 2011 19:14:21 +0200 Subject: [PATCH 3/5] some commentary copyright infos some instructions on how to use the plugin --- pelican/plugins/github_activity.py | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/pelican/plugins/github_activity.py b/pelican/plugins/github_activity.py index d279e616..bbce2759 100644 --- a/pelican/plugins/github_activity.py +++ b/pelican/plugins/github_activity.py @@ -1,8 +1,32 @@ +# -*- coding: utf-8 -*- +""" + Copyright (c) Marco Milanesi + + A plugin to list your Github Activity + To enable it set in your pelican config file the GITHUB_ACTIVITY_FEED + parameter pointing to your github activity feed. + + for example my personal activity feed is: + + https://github.com/kpanic.atom + + in your template just write a for in jinja2 syntax against the + github_activity variable. + + github_activity is a list containing raw html from github so you can + include it directly in your template + +""" + from pelican import signals from pelican.utils import singleton + @singleton class GitHubActivity(): + """ + A class created to fetch github activity with feedparser + """ def __init__(self, generator): try: import feedparser @@ -12,10 +36,17 @@ class GitHubActivity(): raise Exception("unable to find feedparser") def fetch(self): + """ + returns a list of html snippets fetched from github actitivy feed + """ return [activity['content'][0]['value'].strip() for activity in self.ga['entries']] + def add_github_activity(generator, metadata): + """ + registered handler for the github activity plugin + """ if 'GITHUB_ACTIVITY_FEED' in generator.settings.keys(): ga = GitHubActivity(generator) @@ -23,5 +54,9 @@ def add_github_activity(generator, metadata): ga_html_snippets = ga.fetch() generator.context['github_activity'] = ga_html_snippets + def register(): + """ + Plugin registration + """ signals.article_generate_context.connect(add_github_activity) From 48d7df72f1a0d9c405cac85b662a70c6c14dc238 Mon Sep 17 00:00:00 2001 From: Marco Milanesi Date: Wed, 7 Sep 2011 17:08:28 +0200 Subject: [PATCH 4/5] refactored code and introduced a new signal in ArticlesGenerator __init__ --- pelican/generators.py | 1 + pelican/plugins/github_activity.py | 26 ++++++++++++++++---------- pelican/signals.py | 1 + pelican/utils.py | 12 ------------ 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/pelican/generators.py b/pelican/generators.py index 38fa9da7..9baf240e 100755 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -101,6 +101,7 @@ class ArticlesGenerator(Generator): self.categories = defaultdict(list) super(ArticlesGenerator, self).__init__(*args, **kwargs) self.drafts = [] + signals.article_generator_init.send(self) def generate_feeds(self, writer): """Generate the feeds from the current context, and output files.""" diff --git a/pelican/plugins/github_activity.py b/pelican/plugins/github_activity.py index bbce2759..ba6cd70f 100644 --- a/pelican/plugins/github_activity.py +++ b/pelican/plugins/github_activity.py @@ -19,10 +19,8 @@ """ from pelican import signals -from pelican.utils import singleton -@singleton class GitHubActivity(): """ A class created to fetch github activity with feedparser @@ -30,7 +28,7 @@ class GitHubActivity(): def __init__(self, generator): try: import feedparser - self.ga = feedparser.parse( + self.activities = feedparser.parse( generator.settings['GITHUB_ACTIVITY_FEED']) except ImportError: raise Exception("unable to find feedparser") @@ -40,23 +38,31 @@ class GitHubActivity(): returns a list of html snippets fetched from github actitivy feed """ return [activity['content'][0]['value'].strip() - for activity in self.ga['entries']] + for activity in self.activities['entries']] -def add_github_activity(generator, metadata): +def fetch_github_activity(gen, metadata): """ registered handler for the github activity plugin + it puts in generator.context the html needed to be displayed on a + template """ - if 'GITHUB_ACTIVITY_FEED' in generator.settings.keys(): - ga = GitHubActivity(generator) + if 'GITHUB_ACTIVITY_FEED' in gen.settings.keys(): + gen.context['github_activity'] = gen.plugin_instance.fetch() - ga_html_snippets = ga.fetch() - generator.context['github_activity'] = ga_html_snippets + +def feed_parser_initialization(generator): + """ + Initialization of feed parser + """ + + generator.plugin_instance = GitHubActivity(generator) def register(): """ Plugin registration """ - signals.article_generate_context.connect(add_github_activity) + signals.article_generator_init.connect(feed_parser_initialization) + signals.article_generate_context.connect(fetch_github_activity) diff --git a/pelican/signals.py b/pelican/signals.py index f2bf4547..b1c35794 100644 --- a/pelican/signals.py +++ b/pelican/signals.py @@ -2,3 +2,4 @@ from blinker import signal initialized = signal('pelican_initialized') article_generate_context = signal('article_generate_context') +article_generator_init = signal('article_generator_init') diff --git a/pelican/utils.py b/pelican/utils.py index a67836ca..8e48c2e9 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -222,15 +222,3 @@ def files_changed(path, extensions): LAST_MTIME = mtime return True return False - -def singleton(cls): - """ - Singleton decorator for multiple calls inside plugins - for an example see pelican/plugins/github_activity.py - """ - instances = {} - def getinstance(*args, **kwargs): - if cls not in instances: - instances[cls] = cls(*args, **kwargs) - return instances[cls] - return getinstance From 948ef452ca7d6a02175674b1169fa9c700f72c28 Mon Sep 17 00:00:00 2001 From: Marco Milanesi Date: Wed, 7 Sep 2011 18:55:37 +0200 Subject: [PATCH 5/5] documentation for the github activity plugin --- docs/plugins.rst | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/docs/plugins.rst b/docs/plugins.rst index 6763f5ef..42ecd656 100644 --- a/docs/plugins.rst +++ b/docs/plugins.rst @@ -52,12 +52,13 @@ List of signals Here is the list of currently implemented signals: -========================= ============================ ===================== +========================= ============================ ========================================= Signal Arguments Description -========================= ============================ ===================== +========================= ============================ ========================================= initialized pelican object article_generate_context article_generator, metadata -========================= ============================ ===================== +article_generator_init article_generator invoked in the ArticlesGenerator.__init__ +========================= ============================ ========================================= The list is currently small, don't hesitate to add signals and make a pull request if you need them! @@ -73,3 +74,41 @@ Tag cloud Translation ----------- + +Github Activity +_______________ + +This plugins introduces a new depencency, you have to install feedparser +if you want to use it, these are some ways to do it:: + + apt-get install python-feedparser # on debian based distributions like ubuntu + sudo easy_install feedparser + sudo pip install feedparser + +To enable it set in your pelican config file the GITHUB_ACTIVITY_FEED +parameter pointing to your github activity feed. + +for example my personal activity feed is:: + + https://github.com/kpanic.atom + +and the config line could be:: + + GITHUB_ACTIVITY_FEED = 'https://github.com/kpanic.atom' + +in your template just write a for in jinja2 syntax against the +github_activity variable, like for example:: + + {% if GITHUB_ACTIVITY_FEED %} + + {% endif %} + + +github_activity is a list containing raw html from github so you can include it +directly in your (for example base.html) template and style it in a way that +your prefer using your css skills