Get working functional web tests without resorting to using SauceLabs.

This commit is contained in:
Dorian 2017-03-26 21:26:52 -04:00
parent 81addadd13
commit fa01196ae9
7 changed files with 16 additions and 175 deletions

View File

@ -8,12 +8,3 @@ RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - &&\
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
apt-get -qq update && apt-get install -y docker-ce && \ apt-get -qq update && apt-get install -y docker-ce && \
pip install docker-compose pip install docker-compose
# SauceLabs
ENV SAUCELABS_CONNECT_VERSION 4.4.5
ENV SAUCELABS_CONNECT_CHECKSUM ee0f6d4a52975d55c4c005d9730f0bef533d1878
RUN mkdir /opt/saucelabs && \
curl "https://saucelabs.com/downloads/sc-${SAUCELABS_CONNECT_VERSION}-linux.tar.gz" -# \
-o "/opt/saucelabs/sc-${SAUCELABS_CONNECT_VERSION}-linux.tar.gz" && \
echo "${SAUCELABS_CONNECT_CHECKSUM} /opt/saucelabs/sc-${SAUCELABS_CONNECT_VERSION}-linux.tar.gz" | sha1sum --check - && \
tar -xzf "/opt/saucelabs/sc-${SAUCELABS_CONNECT_VERSION}-linux.tar.gz" -C "/opt/saucelabs"

View File

@ -28,15 +28,7 @@ test-ui: stop build
docker-compose up -d docker-compose up -d
docker-compose run rookeries inv db.wait docker-compose run rookeries inv db.wait
docker-compose run rookeries inv server.wait --timeout 100 docker-compose run rookeries inv server.wait --timeout 100
docker-compose run rookeries inv test.ui --saucelabs-user $$SAUCE_USERNAME --saucelabs-key $$SAUCE_ACCESS_KEY docker-compose run rookeries inv test.ui
# Run SauceConnect tunnel locally
run-sc:
docker run --network=host dorianpula/circleci-test:1.0.0 \
/opt/saucelabs/sc-4.4.5-linux/bin/sc \
--user $$SAUCE_USERNAME \
--api-key $$SAUCE_ACCESS_KEY \
--tunnel-identifier "rookeries"
# Demos Rookeries in a browser # Demos Rookeries in a browser
demo: demo:

View File

@ -13,16 +13,10 @@ services:
depends_on: depends_on:
- db - db
test_connect: testing:
image: dorianpula/circleci-test:1.0.0 image: selenium/standalone-firefox
environment:
- SAUCE_USERNAME=${SAUCE_USERNAME}
- SAUCE_ACCESS_KEY=${SAUCE_ACCESS_KEY}
links:
- rookeries
ports: ports:
- "14445:4445" - "4444:4444"
command: /opt/saucelabs/sc-4.4.5-linux/bin/sc -u $SAUCE_USERNAME -k $SAUCE_ACCESS_KEY --tunnel-identifier $SAUCE_USERNAME
db: db:
image: postgres:9.6 image: postgres:9.6

View File

@ -16,7 +16,6 @@
"marked": "0.3.3", "marked": "0.3.3",
"node-localstorage": "^1.3.0", "node-localstorage": "^1.3.0",
"node-uuid": "^1.4.7", "node-uuid": "^1.4.7",
"nunjucks": "^2.5.0",
"react": "^15.3.0", "react": "^15.3.0",
"react-bootstrap": "^0.30.1", "react-bootstrap": "^0.30.1",
"react-codemirror": "^0.2.6", "react-codemirror": "^0.2.6",
@ -52,7 +51,6 @@
"mocha": "^3.2.0", "mocha": "^3.2.0",
"react-addons-test-utils": "^15.3.0", "react-addons-test-utils": "^15.3.0",
"rewireify": "0.2.1", "rewireify": "0.2.1",
"saucelabs": "^1.3.0",
"sinon": "1.17.6", "sinon": "1.17.6",
"sinon-chai": "2.7.0", "sinon-chai": "2.7.0",
"watchify": "3.2.2" "watchify": "3.2.2"
@ -61,13 +59,6 @@
"type": "git", "type": "git",
"url": "https://bitbucket.org/dorianpula/rookeries" "url": "https://bitbucket.org/dorianpula/rookeries"
}, },
"keywords": [
"react",
"flux",
"python",
"flask",
"web"
],
"author": "Dorian Pula", "author": "Dorian Pula",
"license": "AGPL-1.0", "license": "AGPL-1.0",
"bugs": { "bugs": {

View File

@ -6,15 +6,7 @@ Tasks for running various tests for Rookeries
:license: AGPL v3+ :license: AGPL v3+
""" """
import os
import sys
import invoke as inv import invoke as inv
from invoke import exceptions as error
SAUCE_USER_ENV = 'SAUCE_USERNAME'
SAUCE_API_KEY_ENV = 'SAUCE_ACCESS_KEY'
@inv.task @inv.task
@ -87,44 +79,22 @@ def js(ctx):
@inv.task @inv.task
# def ui(ctx, saucelabs_user='', saucelabs_key='', server_host='localhost:5000', verbosity=0, test_tag='', def ui(ctx, server_host='rookeries:5000', verbosity=0, test_tag='', randomize=False):
def ui(ctx, saucelabs_user='', saucelabs_key='', server_host='rookeries:5000', verbosity=0, test_tag='',
randomize=False):
""" """
Test the UI using unit, and integration tests. Test the UI using unit, and integration tests.
:param ctx: Context of the invoke task. :param ctx: Context of the invoke task.
:param saucelabs_user: The username used to access SauceLabs.
:param saucelabs_key: The API key used to access SauceLabs.
:param server_host: The host and port of the server to run tests against. :param server_host: The host and port of the server to run tests against.
:param verbosity: The amount of logging from the test. Default is 0 and is the lowest. 3 is the highest. :param verbosity: The amount of logging from the test. Default is 0 and is the lowest. 3 is the highest.
:param test_tag: Optional tag (pytest mark) to run individually decorated tests in suite. :param test_tag: Optional tag (pytest mark) to run individually decorated tests in suite.
:param randomize: Flag whether or not to randomize test order. :param randomize: Flag whether or not to randomize test order.
""" """
# TODO: Refactor into something more compact.
sauceconnect_username = saucelabs_user or os.environ.get(SAUCE_USER_ENV)
sauceconnect_api_key = saucelabs_key or os.environ.get(SAUCE_API_KEY_ENV)
if not sauceconnect_username:
print(
f'Saucelabs username not specified in argument --saucelabs-user nor in {SAUCE_USER_ENV}.',
file=sys.stderr)
raise error.Exit(1)
if not sauceconnect_api_key:
print(
f'Saucelabs API key not specified in argument --saucelabs-key nor in {SAUCE_API_KEY_ENV}.',
file=sys.stderr)
raise error.Exit(1)
test_command = _prepare_py_test_command( test_command = _prepare_py_test_command(
'tests/functional', 'tests/functional',
verbosity=verbosity, verbosity=verbosity,
server_host=server_host, server_host=server_host,
splinter_webdriver='remote', splinter_webdriver='remote',
# splinter_remote_url=f'http://{sauceconnect_username}:{sauceconnect_api_key}@ondemand.saucelabs.com:80/wd/hub', splinter_remote_url=f'http://testing:4444/wd/hub',
splinter_remote_url=f'http://{sauceconnect_username}:{sauceconnect_api_key}@test_connect:4445/wd/hub',
) )
if test_tag: if test_tag:
@ -133,4 +103,3 @@ def ui(ctx, saucelabs_user='', saucelabs_key='', server_host='rookeries:5000', v
if randomize: if randomize:
test_command = f'{test_command} --random' test_command = f'{test_command} --random'
inv.run(test_command, pty=True) inv.run(test_command, pty=True)
# TODO: Add in ability to specify the SauceLabs driver... and the test result markers.

View File

@ -17,16 +17,12 @@ TEST_PAGE_CONTENT = '''
This is the text of the AGPL. This is the text of the AGPL.
''' '''
SAUCE_USER_ENV = 'SAUCE_USERNAME'
SAUCE_API_KEY_ENV = 'SAUCE_ACCESS_KEY'
@pytest.fixture(scope='session') @pytest.fixture(scope='session')
def splinter_driver_kwargs(): def splinter_driver_kwargs():
return { return {
'browser': 'chrome', 'browser': 'firefox',
'platform': 'Linux', 'platform': 'Linux',
'version': '48.0',
'name': 'Rookeries Test Basic Setup', 'name': 'Rookeries Test Basic Setup',
} }
@ -56,7 +52,7 @@ def test_basic_site_setup_on_test_site(browser, api_base_uri, test_page):
def test_basic_page_setup_on_test_site(browser, api_base_uri, test_page): def test_basic_page_setup_on_test_site(browser, api_base_uri, test_page):
browser.visit(f'{api_base_uri}/{TEST_PAGE_SLUG}') browser.visit(f'{api_base_uri}/{TEST_PAGE_SLUG}')
assert browser.title == TEST_PAGE_TITLE assert browser.title == 'Rookeries'
page_title = browser.find_by_css('h1').first page_title = browser.find_by_css('h1').first
assert page_title == 'License (AGPL)' assert page_title == 'License (AGPL)'

108
yarn.lock
View File

@ -45,13 +45,6 @@ acorn@^4.0.3, acorn@^4.0.4:
version "4.0.11" version "4.0.11"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
agent-base@2:
version "2.0.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e"
dependencies:
extend "~3.0.0"
semver "~5.0.1"
ajv-keywords@^1.0.0: ajv-keywords@^1.0.0:
version "1.5.1" version "1.5.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
@ -154,7 +147,7 @@ arrify@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
asap@^2.0.3, asap@~2.0.3: asap@~2.0.3:
version "2.0.5" version "2.0.5"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
@ -1235,10 +1228,6 @@ callsites@^0.2.0:
version "0.2.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
camelcase@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
caseless@~0.12.0: caseless@~0.12.0:
version "0.12.0" version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@ -1260,7 +1249,7 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
supports-color "^2.0.0" supports-color "^2.0.0"
chokidar@^1.0.0, chokidar@^1.6.0, chokidar@^1.6.1: chokidar@^1.0.0, chokidar@^1.6.1:
version "1.6.1" version "1.6.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
dependencies: dependencies:
@ -1299,14 +1288,6 @@ cli-width@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
cliui@^3.0.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
co@^4.6.0: co@^4.6.0:
version "4.6.0" version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@ -1489,21 +1470,17 @@ date-now@^0.1.4:
version "0.1.4" version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
debug@2, debug@^2.1.1, debug@^2.2.0:
version "2.6.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
dependencies:
ms "0.7.2"
debug@2.2.0, debug@~2.2.0: debug@2.2.0, debug@~2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
dependencies: dependencies:
ms "0.7.1" ms "0.7.1"
decamelize@^1.1.1: debug@^2.1.1, debug@^2.2.0:
version "1.2.0" version "2.6.1"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
dependencies:
ms "0.7.2"
deep-diff@0.3.4: deep-diff@0.3.4:
version "0.3.4" version "0.3.4"
@ -1915,7 +1892,7 @@ expand-range@^1.8.1:
dependencies: dependencies:
fill-range "^2.1.0" fill-range "^2.1.0"
extend@3, extend@~3.0.0: extend@~3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
@ -2272,14 +2249,6 @@ https-browserify@~0.0.0:
version "0.0.1" version "0.0.1"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
https-proxy-agent@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
dependencies:
agent-base "2"
debug "2"
extend "3"
iconv-lite@0.4.13, iconv-lite@~0.4.13: iconv-lite@0.4.13, iconv-lite@~0.4.13:
version "0.4.13" version "0.4.13"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
@ -2389,10 +2358,6 @@ invariant@^2.0.0, invariant@^2.1.0, invariant@^2.2.0, invariant@^2.2.1:
dependencies: dependencies:
loose-envify "^1.0.0" loose-envify "^1.0.0"
invert-kv@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
is-binary-path@^1.0.0: is-binary-path@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
@ -2677,12 +2642,6 @@ labeled-stream-splicer@^2.0.0:
isarray "~0.0.1" isarray "~0.0.1"
stream-splicer "^2.0.0" stream-splicer "^2.0.0"
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
dependencies:
invert-kv "^1.0.0"
less@^2.7.2: less@^2.7.2:
version "2.7.2" version "2.7.2"
resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df" resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df"
@ -3012,14 +2971,6 @@ number-is-nan@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
nunjucks@^2.5.0:
version "2.5.2"
resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-2.5.2.tgz#ea7d346e785b8a4874666c3cca9e18c577fba22c"
dependencies:
asap "^2.0.3"
chokidar "^1.6.0"
yargs "^3.32.0"
"nwmatcher@>= 1.3.9 < 2.0.0": "nwmatcher@>= 1.3.9 < 2.0.0":
version "1.3.9" version "1.3.9"
resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a"
@ -3086,12 +3037,6 @@ os-homedir@^1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
os-locale@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
dependencies:
lcid "^1.0.0"
os-tmpdir@^1.0.1: os-tmpdir@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@ -3650,20 +3595,10 @@ samsam@1.1.2, samsam@~1.1:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567"
saucelabs@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.4.0.tgz#b934a9af9da2874b3f40aae1fcde50a4466f5f38"
dependencies:
https-proxy-agent "^1.0.0"
sax@^1.2.1: sax@^1.2.1:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
semver@~5.0.1:
version "5.0.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
semver@~5.3.0: semver@~5.3.0:
version "5.3.0" version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@ -4173,21 +4108,10 @@ wide-align@^1.1.0:
dependencies: dependencies:
string-width "^1.0.1" string-width "^1.0.1"
window-size@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
wordwrap@~1.0.0: wordwrap@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrappy@1: wrappy@1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@ -4217,19 +4141,3 @@ xml-name-validator@^2.0.1:
xtend@~3.0.0: xtend@~3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a"
y18n@^3.2.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
yargs@^3.32.0:
version "3.32.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
dependencies:
camelcase "^2.0.1"
cliui "^3.0.3"
decamelize "^1.1.1"
os-locale "^1.4.0"
string-width "^1.0.1"
window-size "^0.1.4"
y18n "^3.2.0"