ó
ìŠ'Gc           @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m Z e ƒ  a d g Z	 d „  Z
 d „  Z e e d „ Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z e j d „ Z d S(   s§  
Planet Configuration

This module encapsulates all planet configuration.  This is not a generic
configuration parser, it knows everything about configuring a planet - from
the structure of the ini file, to knowledge of data types, even down to
what are the defaults.

Usage:
  import config
  config.load('config.ini')

  # administrative / structural information
  print config.template_files()
  print config.subscriptions()

  # planet wide configuration
  print config.name()
  print config.link()

  # per template configuration
  print config.days_per_page('atom.xml.tmpl')
  print config.encoding('index.html.tmpl')

Todo:
  * error handling (example: no planet section)
iÿÿÿÿN(   t   ConfigParser(   t   urljoint   filtersc             sC  d d l  ‰ d „  ‰  d „  ‰ ‡  ‡ f d †  }  d ‡  ‡ f d † } d ‡  ‡ ‡ f d	 † } ‡ ‡  f d
 †  } ‡ ‡  f d †  } |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d d ƒ |  d  d ƒ |  d! d" ƒ |  d# d ƒ | d$ d ƒ | d% d& ƒ | d' d( ƒ | d) ƒ | d* ƒ | d+ d, ƒ | d- ƒ | d. d ƒ | d/ d0 ƒ | d1 d ƒ | d2 d3 ƒ | d4 d3 ƒ | d5 d ƒ | d6 d ƒ | d7 d ƒ | d8 d ƒ | d4 d ƒ | d9 d: ƒ | d; d ƒ | d< d ƒ | d= d ƒ d S(>   s"   define the struture of an ini fileiÿÿÿÿNc         S   st   |  r( t  j |  | ƒ r( t  j |  | ƒ St  j d | ƒ rl | d k r\ t  j d | d t ƒSt  j d | ƒ S| Sd  S(   Nt   Planett
   log_formatt   raw(   t   parsert
   has_optiont   gett   True(   t   sectiont   optiont   default(    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR   *   s    c   
      S   s´   g  } t  j d ƒ } x˜ |  j ƒ  D]Š } | j | ƒ } | rŸ | j ƒ  \ } } } xW t ƒ  D]< } t | ƒ j | d  ƒ }	 |	 r\ | j	 | |	 | ƒ q\ q\ Wq" | j	 | ƒ q" W| S(   Ns   ^(.*)#{(\w+)}(.*)$(
   t   ret   compilet   splitt   matcht   groupst   subscriptionst   feed_optionsR   t   Nonet   append(
   t   listt   outputt   wildt   fileR   t   pret   vart   postt   subt   value(    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   expand5   s    c            s0   t  ˆ ˆ  | ‡  ‡ f d † ƒ t j ˆ  ƒ d  S(   Nc            s   ˆ d  ˆ  |  ƒ S(   N(   R   (   R   (   t   nameR   (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   <lambda>F   s    (   t   setattrt   planet_predefined_optionsR   (   R    R   (   R   t   config(   R    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   define_planetE   s    i    c            s0   t  ˆ ˆ  ‡ ‡  ‡ f d †  ƒ t j ˆ  ƒ d  S(   Nc              s   t  ˆ d  ˆ ˆ  ƒ ƒ S(   N(   t   intR   (    (   R   R    R   (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR!   K   s    (   R"   R#   R   (   R    R   (   R   R$   (   R    R   s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   define_planet_intJ   s    t    c            s3   t  ˆ ˆ  ‡ ‡  ‡ ‡ f d †  ƒ t j ˆ  ƒ d  S(   Nc              s   ˆ ˆ d  ˆ ˆ  ƒ ƒ S(   N(   R   (    (   R   R    R   R   (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR!   P   s    (   R"   R#   R   (   R    R   (   R   R$   R   (   R    R   s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   define_planet_listO   s    "c            s#   t  ˆ ˆ  | ‡  ‡ f d † ƒ d  S(   Nc            s   ˆ |  ˆ  | ƒ S(   N(    (   R
   R   (   R    R   (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR!   U   s    (   R"   (   R    R   (   R$   R   (   R    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   define_tmplT   s    c            s#   t  ˆ ˆ  | ‡  ‡ f d † ƒ d  S(   Nc            s   t  ˆ |  ˆ  | ƒ ƒ S(   N(   R&   (   R
   R   (   R    R   (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR!   Z   s    (   R"   (   R    R   (   R$   R   (   R    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   define_tmpl_intY   s    R    s   Unconfigured Planett   linkt   cache_directoryt   cachet	   log_levelt   WARNINGR   s"   %(levelname)s:%(name)s:%(message)st   date_formats   %B %d, %Y %I:%M %pt   new_date_formats	   %B %d, %Yt	   generatort   Venust   generator_uris#   http://intertwingly.net/code/venus/t
   owner_names   Anonymous Cowardt   owner_emailt   output_themet
   output_dirR   t   spider_threadst   new_feed_itemst   feed_timeouti   t   cache_keep_entriesi
   t   template_filest   bill_of_materialst   template_directoriest   .t   filter_directoriest   days_per_paget   items_per_pagei<   t   activity_thresholdt   encodings   utf-8t   content_typet   ignore_in_feedt	   name_typet
   title_typet   summary_typet   future_datest   keept   xml_baset   filtert   exclude(   R$   R   (   R%   R'   R)   R*   R+   (    (   R   R$   R   s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   __init__%   sV    		


c            sq  t  ƒ  a t j |  ƒ d d l } d d l } d d l m ‰ m ‰ m ‰  | j } | sz | j	 | j
 ƒ  | j ƒ  ƒ } n  | j ƒ  } | r…xöd t j j t j d d ƒ f D]¿} t j j | | ƒ } t j j | d ƒ } t j j | ƒ r¯ | j ƒ  } | | k r| j | ƒ n  t j j |  ƒ | k rM| j t j j |  ƒ ƒ n  t  ƒ  a t j | ƒ | j ƒ  }	 | g  | j ƒ  D]' }
 |
 | k rt j j | |
 ƒ ^ q7} | j ƒ  } t j d d	 d ƒ t j |  ƒ x0 | j ƒ  D]" } | |	 k ræ|	 j | ƒ qæqæWt j d d
 d j |	 ƒ ƒ t j d d d j | ƒ ƒ t j d d	 d j | | j ƒ  ƒ ƒ Pq¯ q¯ W| j d | ƒ n  | j ƒ  } t j j t j d d ƒ } | | k rñt j j | ƒ rñt j d d d j | | g ƒ ƒ n  | j ƒ  } | rmt j j | j ƒ  ƒ s1t j | j ƒ  ƒ n  ‡ ‡ ‡  ‡ f d †  } x! | D] ‰ t ˆ t | ƒ qPWn  d S(   s$    initialize and load a configurationiÿÿÿÿN(   t   opmlt   foaft
   csv_configR(   i    t   themess
   config.iniR   R>   R?   t    R@   s   Unable to find theme %sR   RB   c            s-  t  ˆ ƒ j d ƒ d k r. ˆ j |  | ƒ n× t  ˆ ƒ j d ƒ d k r\ ˆ  j |  | ƒ n© t  ˆ ƒ j d ƒ d k rŠ ˆ j |  | ƒ n{ t  ˆ ƒ j d ƒ d k rµ | j |  ƒ nP d d l m } d d  l } | j | j | j	 t  ˆ ƒ |  j
 ƒ  d d	 ƒƒ ƒ | j ƒ  g  ˆ g g k r)t ‚ n  d  S(
   NRR   i    RS   t   csvR$   iÿÿÿÿ(   t   shellt   modeRO   (   RG   t   findt   opml2configt   foaf2configt
   csv2configt   readfpt   planetRX   t   StringIOt   runt   getvaluet   sectionst	   Exception(   t   datat   cached_configRX   R`   (   RS   RR   RT   R   (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   data2configÃ   s    "(   R    R   t   readR$   R_   RR   RS   RT   t   loggert	   getLoggerR/   R   R8   t   ost   patht   joint   syst   existsR@   R   t   dirnameR?   R>   t   sett   errorRB   t   reading_listst   cache_lists_directoryt   makedirst   downloadReadingList(   t   config_fileR$   R_   t   logt   themeRl   t	   theme_dirt
   theme_filet   dirst   bomt   dirR>   R   t
   filter_dirRs   Rg   (    (   RT   RS   RR   R   s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   load†   s\    		!)	8 &c         C   sí  d d l  m } d d  l } y5d d  l } d d  l } d d l m }	 |	 | j ƒ  |  ƒ }
 i  } x- | j |  ƒ D] } | j	 |  | ƒ | | <qr WyS | rä t
 ƒ  } | j |
 ƒ x0 | j |  ƒ D] } | j	 |  | ƒ | | <qÁ Wn  Wn n Xt
 ƒ  } | j |  ƒ x- | j ƒ  D] \ } } | j |  | | ƒ qWt t j d d ƒ } t j j d ƒ d k  r€t d t j j | ƒ ƒ } n? t j j t j j ƒ } t d	 | j d
 d ƒ j d d ƒ ƒ } | j t | d |  ƒ ƒ } | j d ƒ r| j d | d ƒ n  | j d ƒ r'| j d | d ƒ n  | j | ƒ } | j j d ƒ re| j |  d | j d ƒ n  | j j d ƒ r”| j |  d | j d ƒ n  | j | j ƒ  ƒ } | r¿| | | ƒ n  | rît |
 d ƒ } | j | ƒ | j  ƒ  n  | j! d |  ƒ | rP| r| j |
 ƒ qP| j ƒ  } | j | ƒ | j" d ƒ | j# | ƒ n  Wn• yt | rÊ| r„| j |
 ƒ s·t$ ƒ  ‚ q·n3 | j ƒ  } | j | ƒ | j" d ƒ | j# | ƒ | j% d |  ƒ n  Wqé| j& d |  ƒ qéXn Xd  S(   Niÿÿÿÿ(   Ri   (   t   filenamet   curdirRA   t   wini    s   file:s   file:///t   :t   |s   \t   /t   etags   If-None-Matchs   last-modifieds   If-Modified-Sincet   ws   Using %s readinglists   Using cached %s readinglists   Unable to read %s readinglist('   R_   Ri   R$   t   urllib2R`   t   planet.spiderR   Rt   t   optionsR   R    Rh   t   add_sectiont   itemsRq   t   getattrRk   Rl   Rn   t   platformRZ   R   t   abspathR‚   t   replacet   Requestt   has_keyt
   add_headert   urlopent   headerst   opent   writet   closet   debugt   seekR^   Rd   t   infot	   exception(   R   t   orig_configt   callbackt	   use_cachet   re_readRi   R$   R‰   R`   R   t   cache_filenameR‹   t   keyRf   R   R   R‚   t   baseRl   t   requestt   responseRe   R.   t   cdata(    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyRv   Ø   s„    	!	'	  c           C   sQ   t  j d d ƒ r7 t j j t ƒ  t  j d d ƒ ƒ n t j j t ƒ  d ƒ Sd  S(   NR   t   http_cache_directoryR.   (   R   R   Rk   Rl   Rm   R-   R   (    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR¨   0  s    c           C   sN   t  j d d ƒ r4 t j j t ƒ  t  j d d ƒ ƒ St j j t ƒ  d ƒ Sd  S(   NR   t   cache_sources_directoryt   sources(   R   R   Rk   Rl   Rm   R-   R   (    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR©   7  s    c           C   s?   t  j d d ƒ r% t  j d d ƒ n t j j t ƒ  d ƒ Sd  S(   NR   Rt   t   lists(   R   R   R   Rk   Rl   Rm   R-   (    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyRt   >  s    c          C   s¢   t  j d d ƒ r" t  j d d ƒ St ƒ  rž xp t ƒ  D]b }  t j j t j j |  ƒ ƒ d } | j	 d ƒ d k s‡ | j	 d ƒ d k r5 t
 t ƒ  | ƒ Sq5 Wn  d  S(   NR   t   feedi    t   atomt   rss(   R   R   R   R,   R>   Rk   Rl   t   splitextt   basenameRZ   R   (   t   template_fileR    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR¬   D  s    	"*c           C   ss   t  j d d ƒ r% t  j d d ƒ nJ t ƒ  rJ t ƒ  j d ƒ d k rJ d St ƒ  ro t ƒ  j d ƒ d k ro d Sd  S(   NR   t   feedtypeR­   i    R®   (   R   R   R   R¬   RZ   (    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR²   M  s    !!c           C   s   t  d d „  t j ƒ  ƒ S(   s    list the feed subscriptions RO   c         S   s'   |  d k o& |  t  ƒ  t ƒ  t ƒ  k S(   NR   (   R>   R   Rs   (   R¬   (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR!   W  s   (   t   __builtins__R   Rc   (    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR   U  s    c          C   sÁ   g  }  x´ t  j ƒ  D]¦ } t  j | d ƒ r t  j | d ƒ } | j d ƒ d k s¦ | j d ƒ d k s¦ | j d ƒ d k s¦ | j d ƒ d k s¦ | j d ƒ d k r¹ |  j | ƒ q¹ q q W|  S(   s%    list of lists of feed subscriptions RG   RR   i    RS   RW   R$   RA   (   R   Rc   R   R   RZ   R   (   t   resultR
   t   type(    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyRs   [  s    **c         C   sí   g  } t  j d d ƒ r7 | t  j d d ƒ j ƒ  7} n  t |  ƒ rf | j d t j t |  ƒ ƒ ƒ n  t |  ƒ r• | j d t j t |  ƒ ƒ ƒ n  xQ |  r§ |  g p­ t	 ƒ  D]7 }  t  j |  d ƒ r® | t  j |  d ƒ j ƒ  7} q® q® W| S(   NR   R   s   regexp_sifter.py?require=s   regexp_sifter.py?exclude=(
   R   R   R   R   RO   R   t   urllibt   quoteRP   R>   (   R
   R   (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR   g  s    		#c           C   s   t  t d „  t j d ƒ ƒ ƒ S(   s"    dictionary of planet wide optionsc         S   s"   |  t  j d |  d |  d k ƒf S(   NR   R   R   (   R   R   (   t   opt(    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR!   x  s   R   (   t   dictt   mapR   R‹   (    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   planet_optionsv  s    c            s   d d l  } t g  t ƒ  j ƒ  D]$ \ } } | t k r | | f ^ q ƒ } t j ˆ  ƒ rŒ | j t t ‡  f d †  t j	 ˆ  ƒ ƒ ƒ ƒ n  | S(   s$    dictionary of feed specific optionsiÿÿÿÿNc            s   |  t  j ˆ  |  ƒ f S(   N(   R   R   (   R¸   (   R
   (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR!   ‚  s    (
   R$   R¹   R»   R   R#   R   t   has_sectiont   updateRº   R‹   (   R
   R$   R£   R   R‹   (    (   R
   s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR   |  s    !c         C   s
   t  |  ƒ S(   s(    dictionary of template specific options(   R   (   R
   (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   template_options†  s    c         C   s
   t  |  ƒ S(   s&    dictionary of filter specific options(   R   (   R
   (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   filter_optionsŠ  s    c         C   s   t  j |  ƒ GHd S(   s    write out an updated template N(   R   R˜   (   R   (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyR˜   Ž  s    (   t   __doc__Rk   Rn   R   R¶   R    t   urlparseR   R   R#   RQ   R€   R	   Rv   R¨   R©   Rt   R¬   R²   R   Rs   R   R   R»   R   R¾   R¿   t   stdoutR˜   (    (    (    s>   /home/sa3ruby/intertwingly.net/code/venus-bzr/planet/config.pyt   <module>   s*   0			a	RX										
		