示例#1
0
 def testAnalyzeIsHorizontalSequence(self):
     dna = [
         "------",
         "------",
         "------",
         "------",
         "------",
         "--TTTT"]
     obj = SimianAnalyzer()
     self.assertTrue(obj.analyze(dna))
示例#2
0
 def testAnalyzeFalse(self):
     dna = [
         "------",
         "------",
         "------",
         "------",
         "------",
         "------"]
     obj = SimianAnalyzer()
     self.assertFalse(obj.analyze(dna))
示例#3
0
 def testAnalyzeIsInvertedDiagonalSequence(self):
     dna = [
         "------",
         "------",
         "-----T",
         "----T-",
         "---T--",
         "--T---"]
     obj = SimianAnalyzer()
     self.assertTrue(obj.analyze(dna))
示例#4
0
 def testAnalyzeIsVerticalSequence(self):
     dna = [
         "------",
         "------",
         "-----T",
         "-----T",
         "-----T",
         "-----T"]
     obj = SimianAnalyzer()
     self.assertTrue(obj.analyze(dna))
示例#5
0
class Dna:
    def __init__(self):
        self.simian = SimianAnalyzer()
        self.dna_table = boto3.resource("dynamodb").Table("dna")
        self.stats_table = boto3.resource("dynamodb").Table("stats")

    @staticmethod
    def __generateId(dna: List[str]) -> str:
        return hashlib.md5("".join(dna).encode("utf-8")).hexdigest()

    @staticmethod
    def __calcRatio(simians: int, humans: int) -> Decimal:
        if not humans:
            return Decimal(0)
        return Decimal(simians / humans).quantize(Decimal("1.0"))

    async def __generateStats(self) -> dict:
        query = self.dna_table.scan(
            Select="COUNT", FilterExpression=Attr("is_simian").eq(True)) or {}
        simians = query.get("Count", 0)
        humans = query.get("ScannedCount", 0) - simians
        item = {
            '_id': "1",
            'simians': simians,
            'humans': humans,
            'ratio': self.__calcRatio(simians, humans)
        }
        self.stats_table.put_item(Item=item)
        return item

    def store(self, dna: List[str]) -> dict:
        Validator.check(dna)
        item = {
            '_id': self.__generateId(dna),
            'dna': dna,
            'is_simian': self.isSimian(dna)
        }
        self.dna_table.put_item(Item=item)
        asyncio.run(self.__generateStats())
        return item

    def isSimian(self, dna: List[str]) -> bool:
        return self.simian.analyze(dna)

    def stats(self) -> dict:
        stats = (self.stats_table.scan(Limit=1).get("Items", [{}]) or [{}])[0]
        return {
            'count_mutant_dna': str(stats.get("simians", 0)),
            'count_human_dna': str(stats.get("humans", 0)),
            'ratio': str(stats.get("ratio", 0))
        }
示例#6
0
 def testAnalyzeFalseBySize(self):
     dna = ["CTGAGA"]
     obj = SimianAnalyzer()
     self.assertFalse(obj.analyze(dna))