Updating copyright lines
========================

Copyright lines can be fixed to

- normalize the year list
- include a specific year in the copyright
- specify the owner of the copyright

Copyright lines can be updated using the `fix_block` function:

>>> from gocept.devtools.copyright import fix_block
>>> def do_fix_block(*args, **kw):
...     print ''.join(fix_block(*args, **kw))


Normalizing the list of years
-----------------------------

If no parameters are given, only normalization of years is applied:

>>> do_fix_block(['# Copyright (c) 2001 FooCorp\n'], 2001, 'FooCorp')
# Copyright (c) 2001 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2001,2002,2003 FooCorp\n'], 2001, 'FooCorp')
# Copyright (c) 2001-2003 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2001,2002,2003,2005 FooCorp\n'],
...              2001, 'FooCorp')
# Copyright (c) 2001-2003,2005 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2001 - 2002, 2003, 2005 FooCorp\n'],
...              2001, 'FooCorp')
# Copyright (c) 2001-2003,2005 FooCorp
<BLANKLINE>

Fixing years for existing owners
--------------------------------

>>> do_fix_block(['# Copyright (c) 2001 FooCorp\n'], 2008, 'FooCorp')
# Copyright (c) 2001,2008 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2007 FooCorp\n'], 2008, 'FooCorp')
# Copyright (c) 2007-2008 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2001-2003 FooCorp\n'], 2008, 'FooCorp')
# Copyright (c) 2001-2003,2008 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2001,2003 FooCorp\n'], 2008, 'FooCorp')
# Copyright (c) 2001,2003,2008 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2001,2003-2005,2007 FooCorp\n'], 2008, 'FooCorp')
# Copyright (c) 2001,2003-2005,2007-2008 FooCorp
<BLANKLINE>

>>> do_fix_block(['# Copyright (c) 2008 FooCorp\n'], 2008, 'FooCorp')
# Copyright (c) 2008 FooCorp
<BLANKLINE>

Lines with errors are not changed:

>>> do_fix_block(['# Copyright (c) 2008--2009 FooCorp\n'], 2010, 'FooCorp')
Traceback (most recent call last):
ValueError: Invalid time period '2008--2009'


Adding new owners
-----------------

The ownership of the copyright can be changed to another holder by specifying
the `owner`

>>> do_fix_block(['# Copyright (c) 2008 FooCorp\n'], 2008, 'Bar Foundation')
# Copyright (c) 2008 FooCorp
# Copyright (c) 2008 Bar Foundation
<BLANKLINE>

Combined fixing
---------------

>>> do_fix_block(['# Copyright (c) 2008 FooCorp\n'], 2009, 'Bar Foundation')
# Copyright (c) 2008 FooCorp
# Copyright (c) 2009 Bar Foundation
<BLANKLINE>


Leading characters
------------------

To avoid replacing non-actual copyright lines and as we only need to support a
limited set of languages:

- Python
- C

>>> do_fix_block(['# Copyright (c) 2008 FooCorp\n'], 2008, 'FooCorp')
# Copyright (c) 2008 FooCorp
<BLANKLINE>

>>> do_fix_block(['    Copyright (c) 2008 FooCorp\n'], 2008, 'FooCorp')
    Copyright (c) 2008 FooCorp
<BLANKLINE>
>>> do_fix_block(['  #    Copyright (c) 2008 FooCorp\n'], 2008, 'FooCorp')
  #    Copyright (c) 2008 FooCorp
<BLANKLINE>

>>> do_fix_block(['/*    Copyright (c) 2008 FooCorp\n'], 2008, 'FooCorp')
Traceback (most recent call last):
ValueError: ('Invalid lead for copyright line', '/*    Copyright (c) 2008 FooCorp\n')


Keeping existing lines intact, appending new data in whole files
----------------------------------------------------------------

>>> from gocept.devtools.copyright import fix_file
>>> from StringIO import StringIO
>>> print fix_file(StringIO("""\
... # Copyright (c) 2008 FooCorp
... Gnarr"""), year=2009, owner='Bar Foundation').getvalue()
# Copyright (c) 2008 FooCorp
# Copyright (c) 2009 Bar Foundation
Gnarr
>>> print fix_file(StringIO("""\
... # Copyright (c) 2008 FooCorp
... Gnarr"""), year=2008, owner='Bar Foundation').getvalue()
# Copyright (c) 2008 FooCorp
# Copyright (c) 2008 Bar Foundation
Gnarr
