Browse Source

Merge pull request #655 from harvardinformatics/master

Add support for Knitr configuration options
Justin Mayer 9 years ago
parent
commit
e4ae03eb08
3 changed files with 113 additions and 11 deletions
  1. 3 1
      .gitignore
  2. 23 10
      rmd_reader/rmd_reader.py
  3. 87 0
      rmd_reader/test_rmd_reader.py

+ 3 - 1
.gitignore

@@ -1,3 +1,5 @@
 *.pyc
 *.log
-*~
+*~
+.project
+.pydevproject

+ 23 - 10
rmd_reader/rmd_reader.py

@@ -9,17 +9,29 @@ from pelican import settings
 from pelican.utils import pelican_open
 from markdown import Markdown
 
-try:
-    with warnings.catch_warnings():
-        warnings.simplefilter("ignore")
-        from rpy2.robjects.packages import importr
-    knitr = importr('knitr')
-    idx = knitr.opts_knit.names.index('set')
-    knitr.opts_knit[idx](**{'base.dir': '{0}/content'.format(settings.DEFAULT_CONFIG.get('PATH'))})
-    rmd = True
-except ImportError:
-    rmd = False
+#import pelicanconf
 
+knitr = None
+rmd = False
+
+def initsignal(pelicanobj):
+    global knitr,rmd
+    try:
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            from rpy2.robjects.packages import importr
+        knitr = importr('knitr')
+        idx = knitr.opts_knit.names.index('set')
+        PATH = pelicanobj.settings.get('PATH','%s/content' % settings.DEFAULT_CONFIG.get('PATH'))
+        knitr.opts_knit[idx](**{'base.dir': PATH})
+        idy = knitr.opts_chunk.names.index('set')
+        knitroptschunk = pelicanobj.settings.get('KNITR_OPTS_CHUNK',None)
+        if knitroptschunk is not None:     
+            knitr.opts_chunk[idy](**{str(k): v for k,v in knitroptschunk.iteritems()})
+        rmd = True
+    except ImportError:
+        rmd = False
+    
 class RmdReader(readers.BaseReader):
     enabled = rmd
     file_extensions = ['Rmd', 'rmd']
@@ -45,3 +57,4 @@ def add_reader(readers):
 
 def register():
     signals.readers_init.connect(add_reader)
+    signals.initialized.connect(initsignal)

+ 87 - 0
rmd_reader/test_rmd_reader.py

@@ -0,0 +1,87 @@
+'''
+Created on Jan 25, 2016
+
+@author: Aaron Kitzmiller <aaron_kitzmiller@harvard.edu?
+'''
+import unittest, os, sys
+import shutil
+import logging
+import glob
+from pelican import Pelican
+from pelican.settings import read_settings
+
+logging.basicConfig(stream=sys.stderr, level=logging.CRITICAL)
+
+class Test(unittest.TestCase):
+
+
+    def setUp(self):
+        try:
+            import rpy2
+            import rmd_reader
+        except Exception, e:
+            raise unittest.SkipTest("rpy not installed.  Will not test rmd_reader.")
+        
+        self.testtitle = 'rtest'
+        self.cwd = os.path.dirname(os.path.abspath(__file__))
+        
+        # Setup content dir and test rmd file
+        self.contentdir = os.path.join(self.cwd,'test-content')
+        try:
+            os.mkdir(self.contentdir)
+        except Exception:
+            pass
+        self.contentfile = os.path.join(self.contentdir,'test.rmd')
+        self.testrmd = '''Title: %s
+Date: 2014-06-23
+
+Let's make a simple plot about cars.
+```{r}
+cars <- c(1, 3, 6, 4, 9)
+plot(cars)
+```
+''' % self.testtitle
+        with open(self.contentfile,'w') as f:
+            f.write(self.testrmd)
+            
+        # Setup output dir
+        self.outputdir = os.path.join(self.cwd,'test-output')
+        try:
+            os.mkdir(self.outputdir)
+        except Exception:
+            pass
+        
+        self.figpath = 'images'
+        
+
+
+    def tearDown(self):
+        if os.path.isdir(self.outputdir):
+            shutil.rmtree(self.outputdir)
+        if os.path.isdir(self.contentdir):
+            shutil.rmtree(self.contentdir)
+
+
+    def testKnitrSettings(self):
+        settings = read_settings(path=None, override={
+            'PATH': self.contentdir,
+            'OUTPUT_PATH': self.outputdir,
+            'KNITR_OPTS_CHUNK': {'fig.path' : '%s/' % self.figpath},
+            'PLUGIN_PATHS': ['../'],
+            'PLUGINS': ['rmd_reader'],
+        })
+        pelican = Pelican(settings=settings)
+        pelican.run()
+        
+        outputfilename = os.path.join(self.outputdir,'%s.html' % self.testtitle)
+        self.assertTrue(os.path.exists(outputfilename),'File %s was not created.' % outputfilename)
+        imagesdir = os.path.join(self.outputdir,self.figpath)
+        self.assertTrue(os.path.exists(imagesdir), 'figpath not created.')
+        images = glob.glob('%s/*' % imagesdir)
+        self.assertTrue(len(images) == 1,'Contents of images dir is not correct: %s' % ','.join(images))
+        
+
+
+if __name__ == "__main__":
+    #import sys;sys.argv = ['', 'Test.testName']
+    unittest.main()