Skip to content

Commit 6f217bd

Browse files
authored
Merge pull request doccano#393 from CatalystCode/enhancement/refactor-to-colour-library
Enhancement/Replace Color class with colour library
2 parents 712c0a3 + d5b9815 commit 6f217bd

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,12 +4,12 @@
44
import json
55
import re
66
from collections import defaultdict
7-
from random import Random
87

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

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

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

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

8889
serializer_labels.append(serializer_label)
8990

@@ -450,47 +451,6 @@ def paint(self, documents):
450451
return res
451452

452453

453-
class Color:
454-
def __init__(self, red, green, blue):
455-
self.red = red
456-
self.green = green
457-
self.blue = blue
458-
459-
@property
460-
def contrast_color(self):
461-
"""Generate black or white color.
462-
463-
Ensure that text and background color combinations provide
464-
sufficient contrast when viewed by someone having color deficits or
465-
when viewed on a black and white screen.
466-
467-
Algorithm from w3c:
468-
* https://www.w3.org/TR/AERT/#color-contrast
469-
"""
470-
return Color.white() if self.brightness < 128 else Color.black()
471-
472-
@property
473-
def brightness(self):
474-
return ((self.red * 299) + (self.green * 587) + (self.blue * 114)) / 1000
475-
476-
@property
477-
def hex(self):
478-
return '#{:02x}{:02x}{:02x}'.format(self.red, self.green, self.blue)
479-
480-
@classmethod
481-
def white(cls):
482-
return cls(red=255, green=255, blue=255)
483-
484-
@classmethod
485-
def black(cls):
486-
return cls(red=0, green=0, blue=0)
487-
488-
@classmethod
489-
def random(cls, seed=None):
490-
rgb = Random(seed).choices(range(256), k=3)
491-
return cls(*rgb)
492-
493-
494454
def iterable_to_io(iterable, buffer_size=io.DEFAULT_BUFFER_SIZE):
495455
"""See https://stackoverflow.com/a/20260030/3817588."""
496456
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
chardet==3.0.4
45
coverage==4.5.3
56
dj-database-url==0.5.0

0 commit comments

Comments
 (0)