[pd-calculators] Canadian Copyright Calculator Algorithm and Flowchart
    Jonathan Gray 
    jonathan.gray at okfn.org
       
    Wed Dec 10 20:03:39 UTC 2008
    
    
  
I thought this might be of interest to people developing calculators.
Its from consortium of people working on Canada's calculator.
Warm regards,
Jonathan
---------- Forwarded message ----------
Have a look at the calculator's algorithm and the flowchart on which
it is based.
Algorithm online at: http://demo.openlibrary.org:9021/file/
4d3fc08999ba/pharos/plugins/copyright/copyrightstatus/ca.py
Flowchart online at: http://www.creativecommons.ca/blog/wp-content/
uploads/2008/04/pdregistryca-pd_flowchart.pdf
        1 from __future__ import with_statement
        2 import time
        3
        4 OLDEST_PERSON_EVER_IN_CANADA = 117
        5 current_year = int(time.strftime('%Y'))
        6
        7 def mmax(*args):
        8   """Return maximum of args given, ignoring any None
values.  If there are
        9   no non-None values, return None.
       10   >>> print mmax()
       11   None
       12   >>> print mmax(1)
       13   1
       14   >>> print mmax(2,None,4,3)
       15   4
       16   >>> print mmax(None,None,None)
       17   None"""
       18
       19   a = list(x for x in args if x is not None)
       20   if len(a) == 0:
       21     return None
       22   return max(a)
       23
       24 def copyright_status(edition):
       25   """Determine copyright status of edition.  Return value
is a dictionary containing
       26   the date at which the edition is conservatively expected
to enter the public domain,
       27   and a list of assumptions made during the calculation."""
       28
       29   assumptions = []
       30   assume = assumptions.append
       31
       32   assume("We're assuming the current year is %d."%
current_year)
       33
       34   pubyear = edition.publish_year
       35   if pubyear is None:
       36     pubyear = current_year
       37     assume("The publication year is unspecified, so we're
assuming that the year of publication is %d."% pubyear)
       38   else:
       39     assume("We're assuming the year of publication is %
d."% pubyear)
       40
       41   if len(edition.authors) > 0:
       42     assume("We're assuming the list of authors is complete.")
       43   else:
       44     assume("We're assuming the authorship is anonymous.")
       45
       46   maxauthordeath = None
       47
       48   def y(author, attr):
       49     """Extract attribute (i.e. a string-valued date field)
from author and
       50     convert it to integer.  If field is absent or no valid
conversion, return None."""
       51     r = author.get(attr, None)
       52     try:
       53       return int(r)
       54     except (ValueError, AttributeError, TypeError):
       55       return None
       56
       57   for author in edition.authors:
       58     ydeath, ybirth = y(author, 'death_date'), y(author,
'birth_date')
       59     aname = author.name
       60
       61     if ydeath:
       62       death_year = ydeath
       63       assume("We're assuming author (%s) died in %d."%
(aname, ydeath))
       64     elif ybirth:
       65       death_year = ybirth + OLDEST_PERSON_EVER_IN_CANADA
       66       assume("We're assuming author (%s) was born in %d."%
(aname, ybirth))
       67     elif pubyear:
       68       death_year = pubyear + OLDEST_PERSON_EVER_IN_CANADA
       69       assume("We're assuming author (%s) was born at the
time of publication, since we don't have a known birthdate."% (aname,))
       70     else:
       71       death_year = None
       72
       73     if death_year is not None and ydeath is None:
       74       if death_year < current_year:
       75         assume("We're assuming author (%s) didn't live
longer than the oldest person ever in Canada, \
       76 and therefore died no later than the year %d, since we
have no known death date."% (aname, death_year))
       77       else:
       78         assume("We're assuming author (%s) will live to
age %d, the same as the oldest person ever in Canada so far." % \
       79              (aname, OLDEST_PERSON_EVER_IN_CANADA))
       80
       81     maxauthordeath = mmax(maxauthordeath, death_year)
       82
       83   if maxauthordeath:
       84     if maxauthordeath < pubyear and pubyear < 1999:
       85       pdyear = pubyear + 50
       86     else:
       87       pdyear = maxauthordeath + 50
       88   else:
       89     pdyear = pubyear + 50
       90
       91   def nominal_death(author):
       92     ydeath, ybirth = y(author, 'death_date'), y(author,
'birth_date')
       93     if ydeath is not None:
       94       return ydeath
       95     if ybirth is not None:
       96       return ybirth + OLDEST_PERSON_EVER_IN_CANADA
       97     return None
       98
       99   if any(nominal_death(author) is None for author in
edition.authors):
      100     assume("We're assuming that the authors whose death
dates are missing didn't die after those whose are available.")
      101
      102   # assume(repr({ 'date': pdyear, 'assumptions':
assumptions })) # debugging diagnostic @@
      103   return { 'date': pdyear, 'assumptions': assumptions }
      104
      105 if __name__ == '__main__':
      106   import doctest
      107   doctest.testmod()
      108
_______________________________________________
Pdregistry mailing list
Pdregistry at archive.org
http://mail.archive.org/cgi-bin/mailman/listinfo/pdregistry
    
    
More information about the pd-discuss
mailing list