# Path: metatlas/datastructures/object_helpers.py
# ON_NERSC = 'METATLAS_LOCAL' not in os.environ
# def callback_method(func):
#     def notify(self, *args, **kwargs):
#     def __getitem__(self, item):
#     def __init__(self, *args):
#     def register_callback(self, cb):
#     def unregister_callback(self, cbid):
# def set_docstring(cls):
# def _get_subclasses(cls):
#     def __init__(self):
#     def get_instance(cls):
#     def get_connection(self):
#     def close_connection(self):
#     def convert_to_double(self, table, entry):
#     def save_objects(self, objects, _override=False):
#     def create_link_tables(self, klass):
#     def _get_save_data(self, obj, override=False):
#     def fix_table(self, table_name):
#     def retrieve(self, object_type, **kwargs):
#     def remove(self, object_type, **kwargs):
#     def remove_objects(self, objects, all_versions=True, **kwargs):
# def format_timestamp(tstamp):
#     def validate(self, obj, value):
#     def retrieve(self):
#     def __repr__(self):
#     def __str__(self):
#     def validate(self, obj, value):
# def get_from_nersc(user, relative_path):
# def rollback_and_log(db_connection, err):
# class NotifyList(list):
# class Workspace(object):
# class MetList(List):
# class MetUnicode(CUnicode):
# class MetFloat(CFloat):
# class MetInt(CInt):
# class MetBool(CBool):
# class Stub(HasTraits):
# class MetInstance(Instance):
# class MetEnum(Enum):


import getpass
import logging
import os
import pprint
import time
import uuid
import pandas as pd
from typing import Dict
from pwd import getpwuid
from tabulate import tabulate
from .object_helpers import (
    set_docstring, Workspace, format_timestamp, MetList,
    MetUnicode, MetFloat, MetInstance, MetInt, MetEnum, MetBool, HasTraits,
    Stub
)
from six.moves import zip
@set_docstring
class Compound(MetatlasObject):
    """A Compound is a structurally distinct entry.  The majority of MetAtlas compounds are from a merge
    of WikiData, miBIG, HMDB, ChEBI, LipidMaps, MetaCyc, GNPS, ENZO-Library, MSMLS-Library.  Compounds that
    had an unparseable structural identifier by RDKIT June, 2016, were ignored.  Distinct molecules are found
    by inchi-key of neutralized and de-salted molecules.
    """
    #name is inherited by all metatlas objects and is the most commonly used name for each compound
    #Description is a short text description of the compound
    iupac_name = MetUnicode(help='IUPAC International Chemical Identifier, optional')
    synonyms = MetUnicode()
    source=MetUnicode()
    chebi_id=MetUnicode()
    hmdb_id=MetUnicode()
    img_abc_id=MetUnicode()
    kegg_id=MetUnicode()
    lipidmaps_id=MetUnicode()
    metacyc_id=MetUnicode()
    pubchem_compound_id=MetUnicode()
    pubchem_url = MetUnicode(help='Reference database table url')
    wikipedia_url = MetUnicode(help='Reference database table url')
    kegg_url = MetUnicode(help='Reference database table url')
    hmdb_url = MetUnicode(help='Reference database table url')
    chebi_url = MetUnicode(help='Reference database table url')
    lipidmaps_url = MetUnicode(help='Reference database table url')

    #RDKIT Calculates these with some helper functions
    formula = MetUnicode()
    mono_isotopic_molecular_weight = MetFloat()
    permanent_charge = MetInt()

# Path: metatlas/datastructures/object_helpers.py
# ON_NERSC = 'METATLAS_LOCAL' not in os.environ
# def callback_method(func):
#     def notify(self, *args, **kwargs):
#     def __getitem__(self, item):
#     def __init__(self, *args):
#     def register_callback(self, cb):
#     def unregister_callback(self, cbid):
# def set_docstring(cls):
# def _get_subclasses(cls):
#     def __init__(self):
#     def get_instance(cls):
#     def get_connection(self):
#     def close_connection(self):
#     def convert_to_double(self, table, entry):
#     def save_objects(self, objects, _override=False):
#     def create_link_tables(self, klass):
#     def _get_save_data(self, obj, override=False):
#     def fix_table(self, table_name):
#     def retrieve(self, object_type, **kwargs):
#     def remove(self, object_type, **kwargs):
#     def remove_objects(self, objects, all_versions=True, **kwargs):
# def format_timestamp(tstamp):
#     def validate(self, obj, value):
#     def retrieve(self):
#     def __repr__(self):
#     def __str__(self):
#     def validate(self, obj, value):
# def get_from_nersc(user, relative_path):
# def rollback_and_log(db_connection, err):
# class NotifyList(list):
# class Workspace(object):
# class MetList(List):
# class MetUnicode(CUnicode):
# class MetFloat(CFloat):
# class MetInt(CInt):
# class MetBool(CBool):
# class Stub(HasTraits):
# class MetInstance(Instance):
# class MetEnum(Enum):


# Path: metatlas/datastructures/metatlas_objects.py
import getpass
import logging
import os
import pprint
import time
import uuid
import pandas as pd
from typing import Dict
from pwd import getpwuid
from tabulate import tabulate
from .object_helpers import (
    set_docstring, Workspace, format_timestamp, MetList,
    MetUnicode, MetFloat, MetInstance, MetInt, MetEnum, MetBool, HasTraits,
    Stub
)
from six.moves import zip

@set_docstring
class Compound(MetatlasObject):
    """A Compound is a structurally distinct entry.  The majority of MetAtlas compounds are from a merge
    of WikiData, miBIG, HMDB, ChEBI, LipidMaps, MetaCyc, GNPS, ENZO-Library, MSMLS-Library.  Compounds that
    had an unparseable structural identifier by RDKIT June, 2016, were ignored.  Distinct molecules are found
    by inchi-key of neutralized and de-salted molecules.
    """
    #name is inherited by all metatlas objects and is the most commonly used name for each compound
    #Description is a short text description of the compound
    iupac_name = MetUnicode(help='IUPAC International Chemical Identifier, optional')
    synonyms = MetUnicode()
    source=MetUnicode()
    chebi_id=MetUnicode()
    hmdb_id=MetUnicode()
    img_abc_id=MetUnicode()
    kegg_id=MetUnicode()
    lipidmaps_id=MetUnicode()
    metacyc_id=MetUnicode()
    pubchem_compound_id=MetUnicode()
    pubchem_url = MetUnicode(help='Reference database table url')
    wikipedia_url = MetUnicode(help='Reference database table url')
    kegg_url = MetUnicode(help='Reference database table url')
    hmdb_url = MetUnicode(help='Reference database table url')
    chebi_url = MetUnicode(help='Reference database table url')
    lipidmaps_url = MetUnicode(help='Reference database table url')

    #RDKIT Calculates these with some helper functions
    formula = MetUnicode()
    mono_isotopic_molecular_weight = MetFloat()
    permanent_charge = MetInt()

    number_components = MetInt(help='Must be one or greater')