Commit bfaeb8f0 authored by Andreas Mueller's avatar Andreas Mueller
Browse files

Merge pull request #117 from pendragon-/master

fix handling of scale parameter & python 3 compatibility for cli
parents 89508af2 714f0a79
import argparse import argparse
import inspect import os
from wordcloud import wordcloud_cli as cli
import wordcloud as wc
from collections import namedtuple from collections import namedtuple
from mock import patch, MagicMock
from nose.tools import assert_equal, assert_true, assert_in
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
import wordcloud as wc
from wordcloud import wordcloud_cli as cli
from mock import patch
from nose.tools import assert_equal, assert_greater, assert_true, assert_in, assert_not_in
temp = NamedTemporaryFile() temp = NamedTemporaryFile()
ArgOption = namedtuple('ArgOption', ['cli_name', 'init_name', 'pass_value', 'fail_value']) ArgOption = namedtuple('ArgOption', ['cli_name', 'init_name', 'pass_value', 'fail_value'])
ARGUMENT_SPEC_TYPED = [ ARGUMENT_SPEC_TYPED = [
...@@ -31,27 +32,14 @@ def all_arguments(): ...@@ -31,27 +32,14 @@ def all_arguments():
return arguments return arguments
def test_argument_spec_matches_to_constructor_args():
args = argparse.Namespace()
for option in all_arguments():
setattr(args, option.init_name, option.pass_value)
supported_args = inspect.getargspec(wc.WordCloud.__init__).args
supported_args.remove('self')
for arg_name in vars(args).keys():
assert_in(arg_name, supported_args)
def test_main_passes_arguments_through(): def test_main_passes_arguments_through():
args = argparse.Namespace() temp_imagefile = NamedTemporaryFile()
args = argparse.Namespace(text='some long text', imagefile=open(temp_imagefile.name, 'w'))
for option in all_arguments(): for option in all_arguments():
setattr(args, option.init_name, option.pass_value) setattr(args, option.init_name, option.pass_value)
args.imagefile = NamedTemporaryFile()
args.text = 'some long text'
with patch('wordcloud.wordcloud_cli.wc.WordCloud', autospec=True) as mock_word_cloud: with patch('wordcloud.wordcloud_cli.wc.WordCloud', autospec=True) as mock_word_cloud:
instance = mock_word_cloud.return_value
instance.to_image.return_value = MagicMock()
cli.main(args) cli.main(args)
posargs, kwargs = mock_word_cloud.call_args posargs, kwargs = mock_word_cloud.call_args
...@@ -106,3 +94,16 @@ def test_parse_args_defaults_to_random_color(): ...@@ -106,3 +94,16 @@ def test_parse_args_defaults_to_random_color():
args = cli.parse_args(['--text', text.name]) args = cli.parse_args(['--text', text.name])
assert_equal(args.color_func, wc.random_color_func) assert_equal(args.color_func, wc.random_color_func)
def test_cli_writes_image():
# ensure writting works with all python versions
temp_imagefile = NamedTemporaryFile()
temp_textfile = NamedTemporaryFile()
temp_textfile.write(b'some text')
temp_textfile.flush()
args = cli.parse_args(['--text', temp_textfile.name, '--imagefile', temp_imagefile.name])
cli.main(args)
assert_greater(os.path.getsize(temp_imagefile.name), 0, msg='expecting image to be written')
...@@ -460,14 +460,14 @@ class WordCloud(object): ...@@ -460,14 +460,14 @@ class WordCloud(object):
else: else:
height, width = self.height, self.width height, width = self.height, self.width
img = Image.new(self.mode, (width * self.scale, height * self.scale), img = Image.new(self.mode, (int(width * self.scale), int(height * self.scale)),
self.background_color) self.background_color)
draw = ImageDraw.Draw(img) draw = ImageDraw.Draw(img)
for (word, count), font_size, position, orientation, color in self.layout_: for (word, count), font_size, position, orientation, color in self.layout_:
font = ImageFont.truetype(self.font_path, font_size * self.scale) font = ImageFont.truetype(self.font_path, int(font_size * self.scale))
transposed_font = ImageFont.TransposedFont(font, transposed_font = ImageFont.TransposedFont(font,
orientation=orientation) orientation=orientation)
pos = (position[1] * self.scale, position[0] * self.scale) pos = (int(position[1] * self.scale), int(position[0] * self.scale))
draw.text(pos, word, fill=color, font=transposed_font) draw.text(pos, word, fill=color, font=transposed_font)
return img return img
......
...@@ -10,7 +10,6 @@ import argparse ...@@ -10,7 +10,6 @@ import argparse
import wordcloud as wc import wordcloud as wc
import numpy as np import numpy as np
import sys import sys
import io
from PIL import Image from PIL import Image
def main(args): def main(args):
...@@ -20,10 +19,9 @@ def main(args): ...@@ -20,10 +19,9 @@ def main(args):
color_func=args.color_func, background_color=args.background_color).generate(args.text) color_func=args.color_func, background_color=args.background_color).generate(args.text)
image = wordcloud.to_image() image = wordcloud.to_image()
b = io.BytesIO()
image.save(b, format='png')
with args.imagefile: with args.imagefile:
args.imagefile.write(b.getvalue()) out = args.imagefile if sys.version < '3' else args.imagefile.buffer
image.save(out, format='png')
def parse_args(arguments): def parse_args(arguments):
prog = 'python wordcloud_cli.py' prog = 'python wordcloud_cli.py'
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment