Skip to content

Commit 4928750

Browse files
committed
Replace Color class with colour library
1 parent 55c6cc2 commit 4928750

File tree

3 files changed

+15
-74
lines changed

3 files changed

+15
-74
lines changed

app/api/tests/test_utils.py

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,7 @@
66

77
from ..models import Label, Document
88
from ..utils import BaseStorage, ClassificationStorage, SequenceLabelingStorage, Seq2seqStorage, CoNLLParser
9-
from ..utils import Color, iterable_to_io
10-
11-
12-
class TestColor(TestCase):
13-
def test_random_color(self):
14-
color = Color.random()
15-
self.assertTrue(0 <= color.red <= 255)
16-
self.assertTrue(0 <= color.green <= 255)
17-
self.assertTrue(0 <= color.blue <= 255)
18-
19-
def test_hex(self):
20-
color = Color(red=255, green=192, blue=203)
21-
self.assertEqual(color.hex, '#ffc0cb')
22-
23-
def test_contrast_color(self):
24-
color = Color(red=255, green=192, blue=203)
25-
self.assertEqual(color.contrast_color.hex, '#000000')
26-
27-
color = Color(red=199, green=21, blue=133)
28-
self.assertEqual(color.contrast_color.hex, '#ffffff')
9+
from ..utils import iterable_to_io
2910

3011

3112
class TestBaseStorage(TestCase):
@@ -48,15 +29,14 @@ def test_to_serializer_format(self):
4829
labels = ['positive']
4930
created = {}
5031

51-
actual = BaseStorage.to_serializer_format(labels, created, random_seed=123)
32+
actual = BaseStorage.to_serializer_format(labels, created)
5233

53-
self.assertEqual(actual, [{
54-
'text': 'positive',
55-
'prefix_key': None,
56-
'suffix_key': 'p',
57-
'background_color': '#0d1668',
58-
'text_color': '#ffffff',
59-
}])
34+
self.assertEqual(len(actual), 1)
35+
self.assertEqual(actual[0]['text'], 'positive')
36+
self.assertIsNone(actual[0]['prefix_key'])
37+
self.assertEqual(actual[0]['suffix_key'], 'p')
38+
self.assertIsNotNone(actual[0]['background_color'])
39+
self.assertIsNotNone(actual[0]['text_color'])
6040

6141
def test_get_shortkey_without_existing_shortkey(self):
6242
label = 'positive'

app/api/utils.py

Lines changed: 6 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
import json
55
import re
66
from collections import defaultdict
7-
from random import Random
87

98
import conllu
109
from django.db import transaction
1110
from django.conf import settings
11+
from colour import Color
1212
import pyexcel
1313
from rest_framework.renderers import JSONRenderer
1414
from seqeval.metrics.sequence_labeling import get_entities
@@ -65,7 +65,7 @@ def exclude_created_labels(cls, labels, created):
6565
return [label for label in labels if label not in created]
6666

6767
@classmethod
68-
def to_serializer_format(cls, labels, created, random_seed=None):
68+
def to_serializer_format(cls, labels, created):
6969
existing_shortkeys = {(label.suffix_key, label.prefix_key)
7070
for label in created.values()}
7171

@@ -80,9 +80,10 @@ def to_serializer_format(cls, labels, created, random_seed=None):
8080
serializer_label['prefix_key'] = shortkey[1]
8181
existing_shortkeys.add(shortkey)
8282

83-
color = Color.random(seed=random_seed)
84-
serializer_label['background_color'] = color.hex
85-
serializer_label['text_color'] = color.contrast_color.hex
83+
background_color = Color(pick_for=label)
84+
text_color = Color('white') if background_color.get_luminance() < 0.5 else Color('black')
85+
serializer_label['background_color'] = background_color.hex
86+
serializer_label['text_color'] = text_color.hex
8687

8788
serializer_labels.append(serializer_label)
8889

@@ -445,47 +446,6 @@ def paint(self, documents):
445446
return res
446447

447448

448-
class Color:
449-
def __init__(self, red, green, blue):
450-
self.red = red
451-
self.green = green
452-
self.blue = blue
453-
454-
@property
455-
def contrast_color(self):
456-
"""Generate black or white color.
457-
458-
Ensure that text and background color combinations provide
459-
sufficient contrast when viewed by someone having color deficits or
460-
when viewed on a black and white screen.
461-
462-
Algorithm from w3c:
463-
* https://www.w3.org/TR/AERT/#color-contrast
464-
"""
465-
return Color.white() if self.brightness < 128 else Color.black()
466-
467-
@property
468-
def brightness(self):
469-
return ((self.red * 299) + (self.green * 587) + (self.blue * 114)) / 1000
470-
471-
@property
472-
def hex(self):
473-
return '#{:02x}{:02x}{:02x}'.format(self.red, self.green, self.blue)
474-
475-
@classmethod
476-
def white(cls):
477-
return cls(red=255, green=255, blue=255)
478-
479-
@classmethod
480-
def black(cls):
481-
return cls(red=0, green=0, blue=0)
482-
483-
@classmethod
484-
def random(cls, seed=None):
485-
rgb = Random(seed).choices(range(256), k=3)
486-
return cls(*rgb)
487-
488-
489449
def iterable_to_io(iterable, buffer_size=io.DEFAULT_BUFFER_SIZE):
490450
"""See https://stackoverflow.com/a/20260030/3817588."""
491451
class IterStream(io.RawIOBase):

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
apache-libcloud==2.4.0
22
applicationinsights==0.11.7
3+
colour==0.1.5
34
coverage==4.5.3
45
dj-database-url==0.5.0
56
Django==2.1.7

0 commit comments

Comments
 (0)