# Path: pump/vivopump.py
# def read_csv_fp(fp, skip=True, delimiter="|"):
#     """
#     Given a filename, read the CSV file with that name.  We use "|" as a
#     separator in CSV files to allow commas to appear in values.
# 
#     CSV files read by this function follow these conventions:
#     --  use delimiter as a separator. Defaults to vertical bar.
#     --  have a first row that contains column headings.
#     --  all elements must have values.  To specify a missing value, use
#         the string "None" or "NULL" between separators, that is |None| or |NULL|
#     --  leading and trailing whitespace in values is ignored.  | The  | will be
#         read as "The"
#     -- if skip=True, rows with too many or too few data elements are skipped.
#        if skip=False, a RowError is thrown
# 
#     CSV files processed by read_csv will be returned as a dictionary of
#     dictionaries, one dictionary per row keyed by an integer row number.  This supports
#     maintaining the order of the data input, which is important for some applications
#     """
# 
#     class RowError(Exception):
#         """
#         Thrown when the number of data elements on a row in a CSV is not equal to the number of header elements
#         """
#         pass
# 
#     heading = []
#     row_number = 0
#     data = {}
#     for row in UnicodeCsvReader(fp, delimiter=delimiter):
#         i = 0
#         for r in row:
#             # remove white space fore and aft
#             row[i] = r.strip(string.whitespace)
#             i += 1
#         if len(heading) == 0:
#             heading = row  # the first row is the heading
#             continue
#         row_number += 1
#         if len(row) == len(heading):
#             data[row_number] = {}
#             i = 0
#             for r in row:
#                 data[row_number][heading[i]] = r
#                 i += 1
#         elif not skip:
#             raise RowError("On row " + str(row_number) + ", expecting " +
#                            str(len(heading)) + " data values. Found " +
#                            str(len(row)) + " data values. Row contents = " +
#                            str(row))
#         else:
#             pass  # row has wrong number of columns and skip is True
#     logger.debug("loader returns {} rows".format(len(data)))
#     return data
# 
# def write_csv_fp(fp, data, delimiter='|'):
#     """
#     Write a CSV to a file pointer.  Used to support stdout.
#     :param fp: File pointer.  Could be stdout.
#     :param data: data to be written
#     :param delimiter: field delimiter for output
#     :return:
#     """
#     assert(len(data.keys()) > 0)
# 
#     # create a list of var_names from the first row
#     var_names = data[data.keys()[0]].keys()
#     fp.write(delimiter.join(var_names) + '\n')
# 
#     for key in sorted(data.keys()):
#         fp.write(delimiter.join([data[key][x] for x in var_names]) + '\n')
# 
# def get_parms():
#     """
#     Use get_args to get the args, and return a dictionary of the args ready for
#     use in pump software.
#     @see get_args()
# 
#     :return: dict: parms
#     """
#     parms = {}
#     args = get_args()
#     for name, val in vars(args).items():
#         if val is not None:
#             parms[name] = val
#     return parms


import sys
from pump.vivopump import read_csv_fp, write_csv_fp, get_parms
from disambiguate import utils

There are two inputs:
    - authors in VIVO keyed by name parts.
    - authors in the source keyed by name parts.

There are two cases:

1.  The source indicates the author is not a UF author.  In this case, the
    author will automatically be added as a "stub."
    No attempt is made to match stubs.  This leads to proliferation of stubs
    but is consistent with "Assert what you know" and avoids assuming two stubs
    are the same.
2.  The source indicates the author is at UF.  In this case, extensive
    disambiguation matching occurs, based on name and name parts.  If no match
    occurs, the author will be added as a UFEntity.  If multiple matches occur,
    one is selected at random and a disambiguation report entry is produced
    showing all the possible matches and the one that was selected.  Many
    disambiguation cases involve two URI.  Randomly selecting one cuts the
    effort to assign these potentially by half.  If exactly one match occurs,
    the match is made, the URI provided in the update data.

"""

__author__ = "Michael Conlon"
__copyright__ = "Copyright 2015 (c) Michael Conlon"
__license__ = "New BSD License"
__version__ = "0.01"




# Path: pump/vivopump.py
# def read_csv_fp(fp, skip=True, delimiter="|"):
#     """
#     Given a filename, read the CSV file with that name.  We use "|" as a
#     separator in CSV files to allow commas to appear in values.
# 
#     CSV files read by this function follow these conventions:
#     --  use delimiter as a separator. Defaults to vertical bar.
#     --  have a first row that contains column headings.
#     --  all elements must have values.  To specify a missing value, use
#         the string "None" or "NULL" between separators, that is |None| or |NULL|
#     --  leading and trailing whitespace in values is ignored.  | The  | will be
#         read as "The"
#     -- if skip=True, rows with too many or too few data elements are skipped.
#        if skip=False, a RowError is thrown
# 
#     CSV files processed by read_csv will be returned as a dictionary of
#     dictionaries, one dictionary per row keyed by an integer row number.  This supports
#     maintaining the order of the data input, which is important for some applications
#     """
# 
#     class RowError(Exception):
#         """
#         Thrown when the number of data elements on a row in a CSV is not equal to the number of header elements
#         """
#         pass
# 
#     heading = []
#     row_number = 0
#     data = {}
#     for row in UnicodeCsvReader(fp, delimiter=delimiter):
#         i = 0
#         for r in row:
#             # remove white space fore and aft
#             row[i] = r.strip(string.whitespace)
#             i += 1
#         if len(heading) == 0:
#             heading = row  # the first row is the heading
#             continue
#         row_number += 1
#         if len(row) == len(heading):
#             data[row_number] = {}
#             i = 0
#             for r in row:
#                 data[row_number][heading[i]] = r
#                 i += 1
#         elif not skip:
#             raise RowError("On row " + str(row_number) + ", expecting " +
#                            str(len(heading)) + " data values. Found " +
#                            str(len(row)) + " data values. Row contents = " +
#                            str(row))
#         else:
#             pass  # row has wrong number of columns and skip is True
#     logger.debug("loader returns {} rows".format(len(data)))
#     return data
# 
# def write_csv_fp(fp, data, delimiter='|'):
#     """
#     Write a CSV to a file pointer.  Used to support stdout.
#     :param fp: File pointer.  Could be stdout.
#     :param data: data to be written
#     :param delimiter: field delimiter for output
#     :return:
#     """
#     assert(len(data.keys()) > 0)
# 
#     # create a list of var_names from the first row
#     var_names = data[data.keys()[0]].keys()
#     fp.write(delimiter.join(var_names) + '\n')
# 
#     for key in sorted(data.keys()):
#         fp.write(delimiter.join([data[key][x] for x in var_names]) + '\n')
# 
# def get_parms():
#     """
#     Use get_args to get the args, and return a dictionary of the args ready for
#     use in pump software.
#     @see get_args()
# 
#     :return: dict: parms
#     """
#     parms = {}
#     args = get_args()
#     for name, val in vars(args).items():
#         if val is not None:
#             parms[name] = val
#     return parms


# Path: uf_examples/publications/filters/author_match_filter.py
import sys
from pump.vivopump import read_csv_fp, write_csv_fp, get_parms
from disambiguate import utils


There are two inputs:
    - authors in VIVO keyed by name parts.
    - authors in the source keyed by name parts.

There are two cases:

1.  The source indicates the author is not a UF author.  In this case, the
    author will automatically be added as a "stub."
    No attempt is made to match stubs.  This leads to proliferation of stubs
    but is consistent with "Assert what you know" and avoids assuming two stubs
    are the same.
2.  The source indicates the author is at UF.  In this case, extensive
    disambiguation matching occurs, based on name and name parts.  If no match
    occurs, the author will be added as a UFEntity.  If multiple matches occur,
    one is selected at random and a disambiguation report entry is produced
    showing all the possible matches and the one that was selected.  Many
    disambiguation cases involve two URI.  Randomly selecting one cuts the
    effort to assign these potentially by half.  If exactly one match occurs,
    the match is made, the URI provided in the update data.

"""

__author__ = "Michael Conlon"
__copyright__ = "Copyright 2015 (c) Michael Conlon"
__license__ = "New BSD License"
__version__ = "0.01"




parms = get_parms()