"Fossies" - the Fresh Open Source Software Archive

Member "versions-1.5.5/versions/common.py" (27 Oct 2021, 4535 Bytes) of package /linux/misc/versions-1.5.5.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the latest Fossies "Diffs" side-by-side code changes report for "common.py": 1.5.4_vs_1.5.5.

    1 #!/usr/bin/env python
    2 # -*- coding: utf8 -*-
    3 #
    4 #  common.py : common tools used by versions.py modules
    5 #
    6 #  (C) Copyright 2016 - 2018 Olivier Delhomme
    7 #  e-mail : olivier.delhomme@free.fr
    8 #
    9 #  This program is free software; you can redistribute it and/or modify
   10 #  it under the terms of the GNU General Public License as published by
   11 #  the Free Software Foundation; either version 3, or (at your option)
   12 #  any later version.
   13 #
   14 #  This program is distributed in the hope that it will be useful,
   15 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
   16 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   17 #  GNU General Public License for more details.
   18 #
   19 #  You should have received a copy of the GNU General Public License
   20 #  along with this program; if not, write to the Free Software Foundation,
   21 #  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   22 #
   23 import feedparser
   24 import time
   25 
   26 
   27 def get_entry_published_date(entry):
   28     """
   29     Returns the published date of an entry.
   30     Selects the right field to do so
   31     """
   32     published_date = None
   33     field_name = ''
   34 
   35     if 'published_parsed' in entry:
   36         published_date = entry.published_parsed
   37         field_name = 'published_parsed'
   38     elif 'updated_parsed' in entry:
   39         published_date = entry.updated_parsed
   40         field_name = 'updated_parsed'
   41     elif 'pubDate' in entry:    # rss-0.91.dtd (netscape)
   42         published_date = entry.pubDate
   43         field_name = 'pubDate'
   44 
   45     return (published_date, field_name)
   46 
   47 # End of get_entry_published_date() function
   48 
   49 
   50 def make_list_of_newer_feeds(feed, feed_info, debug):
   51     """
   52     Compares feed entries and keep those that are newer than the latest
   53     check we've done and inserting the newer ones in reverse order in
   54     a list to be returned
   55     """
   56 
   57     feed_list = []
   58 
   59     # inserting into a list in reverse order to keep the most recent
   60     # version in case of multiple release of the same project in the
   61     # feeds
   62     for a_feed in feed.entries:
   63 
   64         if a_feed:
   65             (published_date, field_name) = get_entry_published_date(a_feed)
   66 
   67             print_debug(debug, u'\tFeed entry ({0}): Feed title: "{1:16}"'.format(time.strftime('%x %X', published_date), a_feed.title))
   68 
   69             if feed_info.is_newer(published_date):
   70                 feed_list.insert(0, a_feed)
   71         else:
   72             print(u'Warning: empty feed in {}'.format(feed))
   73 
   74     return feed_list
   75 
   76 # End of make_list_of_newer_feeds() function
   77 
   78 
   79 def manage_http_status(feed, url):
   80     """
   81     Manages http status code present in feed and prints
   82     an error in case of a 3xx, 4xx or 5xx and stops
   83     doing anything for the feed by returning None.
   84     """
   85 
   86     err = feed.status / 100
   87 
   88     if err > 2:
   89         print(u'Error {} while fetching "{}".'.format(feed.status, url))
   90         feed = None
   91 
   92     return feed
   93 
   94 # End of manage_http_status() function
   95 
   96 
   97 def manage_non_http_errors(feed, url):
   98     """
   99     Tries to manage non http errors and gives
  100     a message to the user.
  101     """
  102 
  103     if feed.bozo:
  104         if feed.bozo_exception:
  105             exc = feed.bozo_exception
  106             if hasattr(exc, 'reason'):
  107                 message = exc.reason
  108             else:
  109                 message = 'unaddressed'
  110 
  111             print(u'Error {} while fetching "{}".'.format(message, url))
  112 
  113         else:
  114             print(u'Error while fetching url "{}".'.format(url))
  115 
  116 # End of manage_non_http_errors() function
  117 
  118 
  119 def get_feed_entries_from_url(url):
  120     """
  121     Gets feed entries from an url that should be an
  122     RSS or Atom feed.
  123     >>> get_feed_entries_from_url("http://delhomme.org/notfound.html")
  124     Error 404 while fetching "http://delhomme.org/notfound.html".
  125     >>> feed = get_feed_entries_from_url("https://github.com/dupgit/versions/tags.atom")
  126     >>> feed.status
  127     200
  128     """
  129 
  130     feed = feedparser.parse(url)
  131 
  132     if 'status' in feed:
  133         feed = manage_http_status(feed, url)
  134     else:
  135         # An error happened such that the feed does not contain an HTTP answer.
  136         manage_non_http_errors(feed, url)
  137         feed = None
  138 
  139     return feed
  140 
  141 # End of get_feed_entries_from_url() function
  142 
  143 
  144 def print_project_version(project, version):
  145     """
  146     Prints to the standard output project name and it's version.
  147     """
  148 
  149     print(u'{} {}'.format(project, version))
  150 
  151 # End of print_project_version() function
  152 
  153 
  154 def print_debug(debug, message):
  155     """
  156     Prints 'message' if debug mode is True
  157     """
  158 
  159     if debug:
  160         print(u'{}'.format(message))
  161 
  162 # End of print_debug() function