Exemplo n.º 1
0
    def test_instantiation(self):

        # string as a list
        R = genRecordType('abc')
        self.assertEqual(R._fields, ('a', 'b', 'c'))

        # list of columns
        R = genRecordType(['a', 'b', 'c'])
        self.assertEqual(R._fields, ('a', 'b', 'c'))

        # from generator
        R = genRecordType((h for h in ['a', 'b', 'c']))
        self.assertEqual(R._fields, ('a', 'b', 'c'))

        # from DataSet
        try:
            from ligature.examples import simpleDataset
            R = genRecordType(simpleDataset)
            self.assertEqual(R._fields, ('a', 'b', 'c'))
        except ImportError:
            pass

        # One columned
        R = genRecordType('a')
        r = R(1)
        self.assertEqual(r._tuple, (1, ))
Exemplo n.º 2
0
    def _resolveSources(self):
        """Sources may overlap: if so, only take the latter."""
        rawSources = [
            source.results if isinstance(source, Composable) else source
            for source in self.sources
        ]

        allFields = []
        # Gather all the fields
        for source in rawSources:
            for field in source._RecordType._fields:
                allFields.append(field)

        scanners = []
        sourceFields = set(allFields)
        for source in reversed(rawSources):
            for field in source._RecordType._fields:
                if field in sourceFields:
                    sourceFields.remove(field)
                    scanners.append((field, self.ScanClass(source, field)))
                if not sourceFields:
                    break
            if not sourceFields:
                break

        # While we want to prioritize later sources, the fields should
        #   likely keep the same order, starting with the earlier sources.
        # see https://stackoverflow.com/a/12814719/1943640
        scanners.sort(key=lambda entry: allFields.index(entry[0]))

        self.scanners = tuple(scanner for field, scanner in scanners)
        self._resultset = RecordSet(recordType=genRecordType(
            field for field, scanner in scanners))
Exemplo n.º 3
0
    def test_replacement(self):

        R = genRecordType('abc')
        r = R((1, 2, 3))
        r._replace(b=5)

        self.assertEqual(r._asdict(), {'a': 1, 'b': 5, 'c': 3})
Exemplo n.º 4
0
    def test_interfaces(self):

        # create the example
        R = genRecordType('abc')
        r = R((1, 2, 3))

        self.assertEqual(r._asdict(), {'a': 1, 'b': 2, 'c': 3})
        self.assertEqual(r._tuple, (1, 2, 3))
        self.assertEqual(r.values, (1, 2, 3))
Exemplo n.º 5
0
 def _initializeDataSet(self, dataset, validate=False):
     """Convert the DataSet type into a RecordSet
     """
     self._RecordType = genRecordType(dataset.getColumnNames())
     columnIxs = range(len(self._RecordType._fields))
     records = []
     for rix in range(dataset.getRowCount()):
         row = tuple(dataset.getValueAt(rix, cix) for cix in columnIxs)
         records.append(self._RecordType(row))
     self._groups = [tuple(records)]
Exemplo n.º 6
0
    def test_sanitizingFields(self):

        fields = ['Column 1', '3', 'Col@2!']
        R = genRecordType(fields)
        self.assertEqual(
            R._lookup, {
                '3': 1,
                'C3': 1,
                'Col@2!': 2,
                'Col_2_': 2,
                'Column 1': 0,
                'Column_1': 0
            })
Exemplo n.º 7
0
    def __init__(self,
                 initialData=None,
                 recordType=None,
                 initialLabel=None,
                 validate=False,
                 scalar_tuples=False,
                 *args,
                 **kwargs):  #, indexingFunction=None):
        """When creating a new RecordSet, the key is to provide an unambiguous RecordType,
             or at least enough information to define one.
        """
        # We can initialize with a record type, a record, or an iterable of records
        # First check if it's a DataSet object. If so, convert it.
        if isinstance(initialData, BasicDataset):
            self._initializeDataSet(initialData)
        elif recordType:
            # create a RecordType, if needed
            if not (isinstance(recordType, type)
                    and issubclass(recordType, RecordType)):
                recordType = genRecordType(recordType,
                                           scalar_tuples=scalar_tuples)
            if initialData:
                self._initializeRaw(recordType, initialData)
            else:
                self._initializeEmpty(recordType)
        elif initialData:
            if isinstance(initialData, RecordSet):
                self._initializeCopy(initialData)
            else:
                self._initializeRecords(initialData, validate)
        else:
            raise ValueError(
                """Insufficient information to initialize the RecordSet."""
                """ A RecordType must be implied by the constructor arguments."""
            )

        # monkey patch for higher speed access
        self._columns = tuple(
            RecordSetColumn(self, ix)
            for ix in range(len(self._RecordType._fields)))

        # Initialize mixins
        super(RecordSet, self).__init__(*args, **kwargs)
Exemplo n.º 8
0
    def __init__(self,
                 sources,
                 function,
                 outputLabels,
                 mapInputs={},
                 *args,
                 **kwargs):
        # Initialize mixins
        super(Calculation, self).__init__(*args, **kwargs)

        self._resultset = RecordSet(recordType=genRecordType(outputLabels))
        self.subscribe(self._resultset)
        self.sources = tuple(sources)

        if isinstance(function, (str, unicode)):
            self.function = Expression(function)
        else:
            self.function = function

        self._mapInputs = mapInputs
        self._resolveSources()