Skip to content

Commit

Permalink
Merge pull request #4 from mfwarren/master
Browse files Browse the repository at this point in the history
adding the ability to instantiate using base class & add example that pa...
  • Loading branch information
magmax committed Oct 31, 2014
2 parents 8c868a4 + 69321a8 commit d575c6e
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 2 deletions.
17 changes: 17 additions & 0 deletions examples/questions_from_json.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import os
import sys
import re
import json
sys.path.append(os.path.realpath('.'))
from pprint import pprint

import inquirer

with open('examples/test_questions.json') as fd:
questions_data = json.loads(fd.read())

questions = [inquirer.load_from_dict(q) for q in questions_data]

answers = inquirer.prompt(questions)

pprint(answers)
15 changes: 15 additions & 0 deletions examples/test_questions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{ "kind": "text",
"name": "name",
"message": "What's your name"
},
{ "kind": "text",
"name": "surname",
"message": "What's your surname"
},
{ "kind": "list",
"name": "size",
"message": "What size do you need?",
"choices": ["Jumbo", "Large", "Standard", "Medium", "Small", "Micro"]
}
]
6 changes: 4 additions & 2 deletions inquirer/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

try:
from .prompt import prompt
from .questions import Text, Password, Confirm, List, Checkbox
from .questions import Text, Password, Confirm, List, Checkbox, \
load_from_dict, load_from_json

__all__ = ['prompt', 'Text', 'Password', 'Confirm', 'List', 'Checkbox']
__all__ = ['prompt', 'Text', 'Password', 'Confirm', 'List', 'Checkbox',
'load_from_dict', 'load_from_json']
except ImportError as e:
print("An error was found, but returning just with the version: %s" % e)
16 changes: 16 additions & 0 deletions inquirer/questions.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,24 @@
# -*- coding: utf-8 -*-
import json

from . import errors


def question_factory(kind, *args, **kwargs):
for clazz in (Text, Password, Confirm, List, Checkbox):
if clazz.kind == kind:
return clazz(*args, **kwargs)
raise errors.UnknownQuestionTypeError()


def load_from_dict(question_dict):
return question_factory(**question_dict)


def load_from_json(question_json):
return question_factory(**json.loads(question_json))


class Question(object):
kind = 'base question'

Expand Down
62 changes: 62 additions & 0 deletions tests/unit/test_question.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,68 @@ def compare(x, y):
except errors.ValidationError:
self.fail('Validation function did not receive the current value')

def test_factory_text_type(self):
name = 'foo'
q = questions.question_factory('text', name)

self.assertEquals('text', q.kind)
self.assertIsInstance(q, questions.Text)
self.assertEquals(name, q.name)

def test_factory_confirm_type(self):
name = 'foo'
q = questions.question_factory('confirm', name)

self.assertEquals('confirm', q.kind)
self.assertIsInstance(q, questions.Confirm)
self.assertEquals(name, q.name)

def test_factory_password_type(self):
name = 'foo'
q = questions.question_factory('password', name)

self.assertEquals('password', q.kind)
self.assertIsInstance(q, questions.Password)
self.assertEquals(name, q.name)

def test_factory_list_type(self):
name = 'foo'
q = questions.question_factory('list', name)

self.assertEquals('list', q.kind)
self.assertIsInstance(q, questions.List)
self.assertEquals(name, q.name)

def test_factory_checkbox_type(self):
name = 'foo'
q = questions.question_factory('checkbox', name)

self.assertEquals('checkbox', q.kind)
self.assertIsInstance(q, questions.Checkbox)
self.assertEquals(name, q.name)

def test_load_from_dict_text_type(self):
name = 'foo'
q = questions.load_from_dict({'kind': 'text', 'name': name})

self.assertEquals('text', q.kind)
self.assertIsInstance(q, questions.Text)
self.assertEquals(name, q.name)

def test_load_from_json_text_type(self):
name = 'foo'
q = questions.load_from_json(
'{"kind": "text", "name": "%s"}' % name)

self.assertEquals('text', q.kind)
self.assertIsInstance(q, questions.Text)
self.assertEquals(name, q.name)

def test_factory_bad_type(self):
name = 'foo'
with self.assertRaises(errors.UnknownQuestionTypeError):
questions.question_factory('bad', name)


class TestConfirmQuestion(unittest.TestCase):
def test_default_default_value_is_false_instead_of_none(self):
Expand Down

0 comments on commit d575c6e

Please sign in to comment.