diff options
| author | Alexandr Kondrashov <[email protected]> | 2015-09-11 16:43:00 +0300 |
|---|---|---|
| committer | Alexandr Kondrashov <[email protected]> | 2015-09-11 16:43:00 +0300 |
| commit | c9725926b2f30bed4e37f57c20ef8ffeb2fd233b (patch) | |
| tree | 2964ad7556549dd3e0712bdfdbc5fc4ae7a9b45f /test-infra | |
| parent | 353e0a49a97c24d89f6cdb95014419d4137dee6e (diff) | |
| parent | b811f8cf9628dbcbfe994f71588c5a0c921a092d (diff) | |
| download | bootstrap-c9725926b2f30bed4e37f57c20ef8ffeb2fd233b.tar.xz bootstrap-c9725926b2f30bed4e37f57c20ef8ffeb2fd233b.zip | |
Merge remote-tracking branch 'twbs/v4-dev' into patch-1
Conflicts:
scss/_custom-forms.scss
scss/_variables.scss
Diffstat (limited to 'test-infra')
| -rw-r--r-- | test-infra/README.md | 118 | ||||
| -rw-r--r-- | test-infra/S3Cachefile.json | 12 | ||||
| -rw-r--r-- | test-infra/gemfiles/core.gemfile | 7 | ||||
| -rw-r--r-- | test-infra/gemfiles/core.gemfile.lock | 15 | ||||
| -rw-r--r-- | test-infra/npm-shrinkwrap.json | 1634 | ||||
| -rw-r--r-- | test-infra/requirements.txt | 1 | ||||
| -rwxr-xr-x | test-infra/s3_cache.py | 184 | ||||
| -rwxr-xr-x | test-infra/uncached-npm-install.sh | 15 |
8 files changed, 528 insertions, 1458 deletions
diff --git a/test-infra/README.md b/test-infra/README.md deleted file mode 100644 index ce7d74b65..000000000 --- a/test-infra/README.md +++ /dev/null @@ -1,118 +0,0 @@ -## What does `s3_cache.py` do? - -### In general -`s3_cache.py` maintains a cache, stored in an Amazon S3 (Simple Storage Service) bucket, of a given directory whose contents are considered non-critical and are completely & solely determined by (and should be able to be regenerated from) a single given file. - -The SHA-256 hash of the single file is used as the key for the cache. The directory is stored as a gzipped tarball. - -All the tarballs are stored in S3's Reduced Redundancy Storage (RRS) storage class, since this is cheaper and the data is non-critical. - -`s3_cache.py` itself never deletes cache entries; deletion should either be done manually or using automatic S3 lifecycle rules on the bucket. - -Similar to git, `s3_cache.py` makes the assumption that [SHA-256 will effectively never have a collision](https://stackoverflow.com/questions/4014090/is-it-safe-to-ignore-the-possibility-of-sha-collisions-in-practice). - - -### For Bootstrap specifically -`s3_cache.py` is used to cache the npm packages that our Grunt tasks depend on and the RubyGems that Jekyll depends on. (Jekyll is needed to compile our docs to HTML so that we can run them thru an HTML5 validator.) - -For npm, the `node_modules` directory is cached based on our `npm-shrinkwrap.json` file. - -For RubyGems, the `gemdir` of the current RVM-selected Ruby is cached based on the `pseudo_Gemfile.lock` file generated by our Travis build script. -`pseudo_Gemfile.lock` contains the versions of Ruby and Jekyll that we're using (read our `.travis.yml` for details). - - -## Why is `s3_cache.py` necessary? -`s3_cache.py` is used to speed up Bootstrap's Travis builds. Installing npm packages and RubyGems used to take up a significant fraction of our total build times. Also, at the time that `s3_cache.py` was written, npm was occasionally unreliable. - -Travis does offer built-in caching on their paid plans, but this do-it-ourselves S3 solution is significantly cheaper since we only need caching and not Travis' other paid features. - - -## Configuration -`s3_cache.py` is configured via `S3Cachefile.json`, which has the following format: -```json -{ - "cache-name-here": { - "key": "path/to/file/to/SHA-256/hash/and/use/that/as/the/cache.key", - "cache": "path/to/directory/to/be/cached", - "generate": "shell-command --to run --to regenerate --the-cache $from scratch" - }, - ... -} -``` - -`s3_cache.py` will SHA-256 hash the contents of the `key` file and try to fetch a tarball from S3 using the hash as the filename. -If it's unable to fetch the tarball (either because it doesn't exist or there was a network error), it will run the `generate` command. If it was able to fetch the tarball, it will extract it to the `cache` directory. -If it had to `generate` the cache, it will later create a tarball of the `cache` directory and try to upload the tarball to S3 using the SHA-256 hash of the `key` file as the tarball's filename. - - -## AWS Setup - -### Overview -1. Create an Amazon Web Services (AWS) account. -2. Create an Identity & Access Management (IAM) user, and note their credentials. -3. Create an S3 bucket. -4. Set permissions on the bucket to grant the user read+write access. -5. Set the user credentials as secure Travis environment variables. - -### In detail -1. Create an AWS account. -2. Login to the [AWS Management Console](https://console.aws.amazon.com). -3. Go to the IAM Management Console. -4. Create a new user (named e.g. `travis-ci`) and generate an access key for them. Note both the Access Key ID and the Secret Access Key. -5. Note the user's ARN (Amazon Resource Name), which can be found in the "Summary" tab of the user browser. This will be of the form: `arn:aws:iam::XXXXXXXXXXXXXX:user/the-username-goes-here` -6. Note the user's access key, which can be found in the "Security Credentials" tab of the user browser. -7. Go to the S3 Management Console. -8. Create a new bucket. For a non-publicly-accessible bucket (like Bootstrap uses), it's recommended that the bucket name be random to increase security. On most *nix machines, you can easily generate a random UUID to use as the bucket name using Python: - - ```bash - python -c "import uuid; print(uuid.uuid4())" - ``` - -9. Determine and note what your bucket's ARN is. The ARN for an S3 bucket is of the form: `arn:aws:s3:::the-bucket-name-goes-here` -10. In the bucket's Properties pane, in the "Permissions" section, click the "Edit bucket policy" button. -11. Input and submit an IAM Policy that grants the user at least read+write rights to the bucket. AWS has a policy generator and some examples to help with crafting the policy. Here's the policy that Bootstrap uses, with the sensitive bits censored: - - ```json - { - "Version": "2012-10-17", - "Id": "PolicyTravisReadWriteNoAdmin", - "Statement": [ - { - "Sid": "StmtXXXXXXXXXXXXXX", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::XXXXXXXXXXXXXX:user/travis-ci" - }, - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetObjectVersion", - "s3:ListBucket", - "s3:DeleteObject", - "s3:DeleteObjectVersion", - "s3:GetObject", - "s3:PutObject" - ], - "Resource": [ - "arn:aws:s3:::XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", - "arn:aws:s3:::XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/*" - ] - } - ] - } - ``` - -12. If you want deletion from the cache to be done automatically based on age (like Bootstrap does): In the bucket's Properties pane, in the "Lifecycle" section, add a rule to expire/delete files based on creation date. -13. Install the [`travis` RubyGem](https://github.com/travis-ci/travis): `gem install travis` -14. Encrypt the environment variables: - - ```bash - travis encrypt --repo twbs/bootstrap "AWS_ACCESS_KEY_ID=XXX" - travis encrypt --repo twbs/bootstrap "AWS_SECRET_ACCESS_KEY=XXX" - travis encrypt --repo twbs/bootstrap "TWBS_S3_BUCKET=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" - ``` - -14. Add the resulting secure environment variables to `.travis.yml`. - - -## Usage -Read `s3_cache.py`'s source code and Bootstrap's `.travis.yml` for how to invoke and make use of `s3_cache.py`. diff --git a/test-infra/S3Cachefile.json b/test-infra/S3Cachefile.json deleted file mode 100644 index 90eae796d..000000000 --- a/test-infra/S3Cachefile.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "npm-modules": { - "key": "./npm-shrinkwrap.json", - "cache": "../node_modules", - "generate": "./uncached-npm-install.sh" - }, - "rubygems": { - "key": "$BUNDLE_GEMFILE", - "cache": "../vendor/cache", - "generate": "cd .. ; bundle install --path=\"`pwd`/vendor/cache\"" - } -} diff --git a/test-infra/gemfiles/core.gemfile b/test-infra/gemfiles/core.gemfile deleted file mode 100644 index 6a8372691..000000000 --- a/test-infra/gemfiles/core.gemfile +++ /dev/null @@ -1,7 +0,0 @@ -# Ruby Gems for the 'core' set of tests -# Run `grunt update-gemfile-lock` to update to the latest compatible versions - -source 'https://rubygems.org' - -gem 'sass', '~> 3.4.9' -gem 'scss-lint', '~> 0.31' diff --git a/test-infra/gemfiles/core.gemfile.lock b/test-infra/gemfiles/core.gemfile.lock deleted file mode 100644 index 03580d83b..000000000 --- a/test-infra/gemfiles/core.gemfile.lock +++ /dev/null @@ -1,15 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - rainbow (2.0.0) - sass (3.4.9) - scss-lint (0.31.0) - rainbow (~> 2.0) - sass (~> 3.4.1) - -PLATFORMS - ruby - -DEPENDENCIES - sass (~> 3.4.9) - scss-lint (~> 0.31) diff --git a/test-infra/npm-shrinkwrap.json b/test-infra/npm-shrinkwrap.json index f7f5faae9..7519fdadc 100644 --- a/test-infra/npm-shrinkwrap.json +++ b/test-infra/npm-shrinkwrap.json @@ -5,12 +5,16 @@ "node-version": "v0.12.7", "dependencies": { "babel-eslint": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-4.0.10.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-4.1.1.tgz", "dependencies": { + "acorn-to-esprima": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/acorn-to-esprima/-/acorn-to-esprima-1.0.2.tgz" + }, "babel-core": { - "version": "5.8.22", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.22.tgz", + "version": "5.8.23", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.23.tgz", "dependencies": { "babel-plugin-constant-folding": { "version": "1.0.1", @@ -79,8 +83,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz" }, "babylon": { - "version": "5.8.22", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.22.tgz" + "version": "5.8.23", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.23.tgz" }, "bluebird": { "version": "2.9.34", @@ -129,8 +133,8 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.1.tgz" }, "core-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.1.1.tgz" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.1.4.tgz" }, "debug": { "version": "2.2.0", @@ -151,8 +155,8 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" }, "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" } } }, @@ -183,8 +187,8 @@ } }, "is-integer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.4.tgz", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.6.tgz", "dependencies": { "is-finite": { "version": "1.0.1", @@ -195,26 +199,6 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } - }, - "is-nan": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz", - "dependencies": { - "define-properties": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.1.tgz", - "dependencies": { - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz" - }, - "object-keys": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.7.tgz" - } - } - } - } } } }, @@ -453,12 +437,12 @@ "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.2.0.tgz", "dependencies": { "recast": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.31.tgz", + "version": "0.10.32", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.32.tgz", "dependencies": { "ast-types": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.9.tgz" + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.11.tgz" }, "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", @@ -797,8 +781,8 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, @@ -899,8 +883,8 @@ } }, "grunt-autoprefixer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/grunt-autoprefixer/-/grunt-autoprefixer-2.2.0.tgz", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/grunt-autoprefixer/-/grunt-autoprefixer-3.0.3.tgz", "dependencies": { "autoprefixer-core": { "version": "5.2.1", @@ -911,80 +895,84 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.4.0.tgz" }, "caniuse-db": { - "version": "1.0.30000271", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000271.tgz" + "version": "1.0.30000291", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000291.tgz" }, "num2fraction": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.1.0.tgz" - }, - "postcss": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz", - "dependencies": { - "es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz" - }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" - } - } - } - } } } }, "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz", "dependencies": { "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" }, "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz", "dependencies": { "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" } } }, "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", "dependencies": { "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" } } }, "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz" } } }, "diff": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.2.2.tgz" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.3.2.tgz" + }, + "postcss": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz", + "dependencies": { + "es6-promise": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz" + }, + "js-base64": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + } + } + } + } } } }, @@ -993,8 +981,8 @@ "resolved": "https://registry.npmjs.org/grunt-babel/-/grunt-babel-5.0.1.tgz", "dependencies": { "babel-core": { - "version": "5.8.22", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.22.tgz", + "version": "5.8.23", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.23.tgz", "dependencies": { "babel-plugin-constant-folding": { "version": "1.0.1", @@ -1063,8 +1051,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz" }, "babylon": { - "version": "5.8.22", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.22.tgz" + "version": "5.8.23", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.23.tgz" }, "bluebird": { "version": "2.9.34", @@ -1113,8 +1101,8 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.1.tgz" }, "core-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.1.1.tgz" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.1.4.tgz" }, "debug": { "version": "2.2.0", @@ -1135,8 +1123,8 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" }, "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" } } }, @@ -1167,8 +1155,8 @@ } }, "is-integer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.4.tgz", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.6.tgz", "dependencies": { "is-finite": { "version": "1.0.1", @@ -1179,26 +1167,6 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } - }, - "is-nan": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz", - "dependencies": { - "define-properties": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.1.tgz", - "dependencies": { - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz" - }, - "object-keys": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.7.tgz" - } - } - } - } } } }, @@ -1437,12 +1405,12 @@ "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.2.0.tgz", "dependencies": { "recast": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.31.tgz", + "version": "0.10.32", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.32.tgz", "dependencies": { "ast-types": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.9.tgz" + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.11.tgz" }, "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", @@ -1540,14 +1508,14 @@ } } }, - "grunt-banner": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/grunt-banner/-/grunt-banner-0.3.1.tgz" - }, "grunt-build-control": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/grunt-build-control/-/grunt-build-control-0.2.2.tgz", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/grunt-build-control/-/grunt-build-control-0.5.0.tgz", "dependencies": { + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + }, "shelljs": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz" @@ -1815,28 +1783,34 @@ } }, "grunt-contrib-connect": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.9.0.tgz", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.11.2.tgz", "dependencies": { "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" }, "connect": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.0.tgz", "dependencies": { - "basic-auth-connect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz" + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + } }, - "body-parser": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", + "finalhandler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", "dependencies": { - "iconv-lite": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz" + "escape-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" }, "on-finished": { "version": "2.3.0", @@ -1848,115 +1822,33 @@ } } }, - "raw-body": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.2.tgz", - "dependencies": { - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - } - } - } - } - }, - "bytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz" - }, - "compression": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", - "dependencies": { - "accepts": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz", - "dependencies": { - "mime-types": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.5.tgz", - "dependencies": { - "mime-db": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.17.0.tgz" - } - } - }, - "negotiator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" - } - } - }, - "compressible": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.5.tgz", - "dependencies": { - "mime-db": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.17.0.tgz" - } - } - }, - "vary": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" - } - } - }, - "connect-timeout": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, - "content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" - }, - "cookie": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz" - }, - "cookie-parser": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + "parseurl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" }, - "csurf": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", - "dependencies": { - "csrf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.0.tgz", - "dependencies": { - "base64-url": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz" - }, - "rndm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.1.0.tgz" - }, - "scmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/scmp/-/scmp-1.0.0.tgz" - }, - "uid-safe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz" - } - } - } - } + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" + } + } + }, + "connect-livereload": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.3.tgz" + }, + "morgan": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "dependencies": { + "basic-auth": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.3.tgz" }, "debug": { "version": "2.2.0", @@ -1972,83 +1864,67 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" }, - "errorhandler": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.2.tgz", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { - "accepts": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz", - "dependencies": { - "mime-types": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.5.tgz", - "dependencies": { - "mime-db": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.17.0.tgz" - } - } - }, - "negotiator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" - } - } - }, - "escape-html": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, - "express-session": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", + "on-headers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.0.tgz" + } + } + }, + "opn": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz" + }, + "portscanner": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.0.0.tgz", + "dependencies": { + "async": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz" + } + } + }, + "serve-index": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.2.tgz", + "dependencies": { + "accepts": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz", "dependencies": { - "crc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz" - }, - "uid-safe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", - "dependencies": { - "base64-url": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz" - } - } + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" } } }, - "finalhandler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "batch": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.2.tgz" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { - "escape-html": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, - "fresh": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" + "escape-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" }, "http-errors": { "version": "1.3.1", @@ -2064,235 +1940,95 @@ } } }, - "method-override": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.5.tgz", - "dependencies": { - "methods": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz" - }, - "vary": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" - } - } - }, - "morgan": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "mime-types": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz", "dependencies": { - "basic-auth": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.3.tgz" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } + "mime-db": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz" } } }, - "multiparty": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", - "dependencies": { - "readable-stream": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - } - }, - "stream-counter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz" - } - } - }, - "on-headers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.0.tgz" - }, "parseurl": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" + } + } + }, + "serve-static": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz", + "dependencies": { + "escape-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" }, - "pause": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz" - }, - "qs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "response-time": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.1.tgz" + "parseurl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" }, - "serve-favicon": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.0.tgz", + "send": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.0.tgz", "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" + }, + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" + }, + "destroy": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" + }, "etag": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - } - }, - "serve-index": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.2.tgz", - "dependencies": { - "accepts": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz", + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { - "negotiator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, - "batch": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.2.tgz" + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, - "escape-html": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, - "mime-types": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.5.tgz", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { - "mime-db": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.17.0.tgz" + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } - } - } - }, - "serve-static": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz", - "dependencies": { - "escape-html": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" }, - "send": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.0.tgz", - "dependencies": { - "destroy": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" - }, - "etag": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } - }, - "range-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.2.tgz" - }, - "statuses": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - } - } - } - } - }, - "type-is": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.7.tgz", - "dependencies": { - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + "range-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.2.tgz" }, - "mime-types": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.5.tgz", - "dependencies": { - "mime-db": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.17.0.tgz" - } - } + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } - }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "vhost": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vhost/-/vhost-3.0.1.tgz" - } - } - }, - "connect-livereload": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.3.tgz" - }, - "opn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz" - }, - "portscanner": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.0.0.tgz", - "dependencies": { - "async": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz" } } } @@ -2346,71 +2082,9 @@ } } }, - "grunt-contrib-csslint": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-csslint/-/grunt-contrib-csslint-0.4.0.tgz", - "dependencies": { - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "dependencies": { - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" - }, - "escape-string-regexp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - } - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - } - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" - } - } - }, - "csslint": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/csslint/-/csslint-0.10.0.tgz", - "dependencies": { - "parserlib": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-0.2.5.tgz" - } - } - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" - } - } - }, "grunt-contrib-cssmin": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.12.3.tgz", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.13.0.tgz", "dependencies": { "chalk": { "version": "1.1.1", @@ -2451,8 +2125,8 @@ } }, "clean-css": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.3.9.tgz", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.3.10.tgz", "dependencies": { "commander": { "version": "2.8.1", @@ -2589,8 +2263,8 @@ } }, "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "object-assign": { "version": "3.0.0", @@ -2604,319 +2278,9 @@ } } }, - "grunt-contrib-jade": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-jade/-/grunt-contrib-jade-0.14.1.tgz", - "dependencies": { - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "dependencies": { - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" - }, - "escape-string-regexp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - } - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - } - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" - } - } - }, - "jade": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/jade/-/jade-1.9.2.tgz", - "dependencies": { - "character-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz" - }, - "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz" - }, - "constantinople": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", - "dependencies": { - "acorn": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.3.0.tgz" - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - } - }, - "transformers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", - "dependencies": { - "css": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", - "dependencies": { - "css-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz" - }, - "css-stringify": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz" - } - } - }, - "promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", - "dependencies": { - "is-promise": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz" - } - } - }, - "uglify-js": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", - "dependencies": { - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - } - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" - } - } - } - } - } - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" - }, - "with": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", - "dependencies": { - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" - }, - "acorn-globals": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.5.tgz", - "dependencies": { - "acorn": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.3.0.tgz" - } - } - } - } - } - } - } - } - }, - "grunt-contrib-jshint": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.11.2.tgz", - "dependencies": { - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" - }, - "jshint": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz", - "dependencies": { - "cli": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "dependencies": { - "lru-cache": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" - } - } - } - } - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "dependencies": { - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "dependencies": { - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "dependencies": { - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz" - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" - } - } - } - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz" - }, - "readable-stream": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - } - } - } - }, - "lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz" - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "dependencies": { - "brace-expansion": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", - "dependencies": { - "balanced-match": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - } - } - } - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz" - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" - } - } - } - } - }, "grunt-contrib-qunit": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-0.5.2.tgz", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-0.7.0.tgz", "dependencies": { "grunt-lib-phantomjs": { "version": "0.6.0", @@ -2951,8 +2315,8 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" }, "rimraf": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.2.tgz" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz" } } }, @@ -3217,8 +2581,8 @@ } }, "grunt-contrib-sass": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-sass/-/grunt-contrib-sass-0.8.1.tgz", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-sass/-/grunt-contrib-sass-0.9.2.tgz", "dependencies": { "async": { "version": "0.9.2", @@ -3262,9 +2626,25 @@ } } }, + "cross-spawn": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-0.2.9.tgz", + "dependencies": { + "lru-cache": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" + } + } + }, "dargs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-2.1.0.tgz" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.0.1.tgz", + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + } }, "which": { "version": "1.1.1", @@ -3281,16 +2661,12 @@ } } } - }, - "win-spawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/win-spawn/-/win-spawn-2.0.0.tgz" } } }, "grunt-contrib-uglify": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.8.1.tgz", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.9.2.tgz", "dependencies": { "chalk": { "version": "1.1.1", @@ -3447,8 +2823,8 @@ } }, "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "object-assign": { "version": "3.0.0", @@ -3461,8 +2837,8 @@ } }, "uglify-js": { - "version": "2.4.17", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.17.tgz", + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "dependencies": { "async": { "version": "0.2.10", @@ -3483,8 +2859,26 @@ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "yargs": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz" + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + }, + "decamelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.0.0.tgz" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + } + } } } }, @@ -3519,8 +2913,8 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, @@ -3587,8 +2981,8 @@ } }, "grunt-csscomb": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/grunt-csscomb/-/grunt-csscomb-3.0.1.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/grunt-csscomb/-/grunt-csscomb-3.1.0.tgz", "dependencies": { "csscomb": { "version": "3.1.8", @@ -3697,8 +3091,8 @@ } }, "eslint": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-1.2.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-1.3.1.tgz", "dependencies": { "concat-stream": { "version": "1.5.0", @@ -3859,8 +3253,58 @@ "resolved": "https://registry.npmjs.org/estraverse-fb/-/estraverse-fb-1.3.1.tgz" }, "globals": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.6.0.tgz" + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-8.7.0.tgz" + }, + "handlebars": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.3.tgz", + "dependencies": { + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + } + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + } + } + }, + "uglify-js": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + } + } + } + } + } + } }, "inquirer": { "version": "0.9.0", @@ -3933,8 +3377,8 @@ } }, "is-my-json-valid": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.1.tgz", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", "dependencies": { "generate-function": { "version": "2.0.0", @@ -3951,8 +3395,8 @@ } }, "jsonpointer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-1.1.0.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, "xtend": { "version": "4.0.0", @@ -3971,8 +3415,8 @@ } }, "js-yaml": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.3.1.tgz", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.1.tgz", "dependencies": { "argparse": { "version": "1.0.2", @@ -4307,16 +3751,16 @@ "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.6.tgz" }, "grunt-html": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/grunt-html/-/grunt-html-4.0.3.tgz", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-html/-/grunt-html-5.0.0.tgz", "dependencies": { "async": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.0.tgz" }, "chalk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.0.tgz", "dependencies": { "ansi-styles": { "version": "2.1.0", @@ -4327,32 +3771,28 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" }, "has-ansi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "dependencies": { "ansi-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } } @@ -4543,8 +3983,8 @@ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz" }, "read": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.6.tgz", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "dependencies": { "mute-stream": { "version": "0.0.5", @@ -4565,8 +4005,8 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.0.tgz" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz" }, "i": { "version": "0.3.3", @@ -4587,8 +4027,8 @@ "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz" }, "rimraf": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.2.tgz" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz" } } }, @@ -4699,59 +4139,59 @@ "resolved": "https://registry.npmjs.org/grunt-line-remover/-/grunt-line-remover-0.0.2.tgz" }, "grunt-postcss": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.3.0.tgz", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.6.0.tgz", "dependencies": { "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" }, "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "dependencies": { "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-2.1.0.tgz" + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz" }, "postcss": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.4.tgz", "dependencies": { - "es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz" - }, "js-base64": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" @@ -4765,6 +4205,16 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } + }, + "supports-color": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.1.tgz", + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } } } } @@ -4789,8 +4239,8 @@ } }, "node-sass": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.2.0.tgz", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.3.2.tgz", "dependencies": { "async-foreach": { "version": "0.1.3", @@ -4851,8 +4301,8 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, @@ -4923,8 +4373,8 @@ } }, "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "object-assign": { "version": "3.0.0", @@ -4943,8 +4393,8 @@ } }, "nan": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz" + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.0.8.tgz" }, "npmconf": { "version": "2.1.2", @@ -5427,8 +4877,8 @@ } }, "is-my-json-valid": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.1.tgz", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", "dependencies": { "generate-function": { "version": "2.0.0", @@ -5445,8 +4895,8 @@ } }, "jsonpointer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-1.1.0.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, "xtend": { "version": "4.0.0", @@ -5505,12 +4955,12 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.5.tgz", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz", "dependencies": { "mime-db": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.17.0.tgz" + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz" } } }, @@ -5549,8 +4999,8 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, "yargs": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.20.0.tgz", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.24.0.tgz", "dependencies": { "camelcase": { "version": "1.2.1", @@ -5569,8 +5019,14 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.3.tgz", "dependencies": { "kind-of": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.0.tgz" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "dependencies": { + "is-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.0.2.tgz" + } + } }, "longest": { "version": "1.0.1", @@ -5593,8 +5049,14 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.3.tgz", "dependencies": { "kind-of": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.0.tgz" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "dependencies": { + "is-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.0.2.tgz" + } + } }, "longest": { "version": "1.0.1", @@ -5619,73 +5081,9 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.0.0.tgz" }, "os-locale": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.2.0.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.3.1.tgz", "dependencies": { - "exec-file-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/exec-file-sync/-/exec-file-sync-2.0.0.tgz", - "dependencies": { - "is-obj": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.0.tgz" - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz" - }, - "spawn-sync": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.13.tgz", - "dependencies": { - "concat-stream": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz", - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "readable-stream": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "process-nextick-args": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.2.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - }, - "util-deprecate": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz" - } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - } - } - }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz" - } - } - } - } - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -6193,8 +5591,8 @@ "resolved": "https://registry.npmjs.org/grunt-stamp/-/grunt-stamp-0.1.0.tgz" }, "load-grunt-tasks": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.1.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.2.0.tgz", "dependencies": { "findup-sync": { "version": "0.2.1", @@ -6423,8 +5821,8 @@ } }, "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "msee": { "version": "0.1.1", @@ -6495,8 +5893,8 @@ } }, "npm": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-2.13.5.tgz", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-2.14.2.tgz", "dependencies": { "abbrev": { "version": "1.0.7", @@ -6535,8 +5933,8 @@ "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-1.0.1.tgz" }, "chownr": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-0.0.2.tgz" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz" }, "cmd-shim": { "version": "2.0.1", @@ -6549,16 +5947,16 @@ } }, "columnify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.1.tgz", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.2.tgz", "dependencies": { "strip-ansi": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "dependencies": { "ansi-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, @@ -6635,8 +6033,8 @@ } }, "fstream-npm": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fstream-npm/-/fstream-npm-1.0.4.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-npm/-/fstream-npm-1.0.5.tgz", "dependencies": { "fstream-ignore": { "version": "1.0.2", @@ -6683,8 +6081,8 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "init-package-json": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.7.1.tgz", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.9.1.tgz", "dependencies": { "promzard": { "version": "0.3.0", @@ -6815,8 +6213,8 @@ "resolved": "https://registry.npmjs.org/normalize-git-url/-/normalize-git-url-3.0.1.tgz" }, "normalize-package-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.1.tgz" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.2.tgz" }, "npm-cache-filename": { "version": "1.0.2", @@ -6831,9 +6229,13 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-4.0.2.tgz" }, "npm-registry-client": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-6.5.1.tgz", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.0.1.tgz", "dependencies": { + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz" + }, "concat-stream": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz", @@ -6959,8 +6361,8 @@ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.1.tgz" }, "read": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.6.tgz", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "dependencies": { "mute-stream": { "version": "0.0.5", @@ -7033,8 +6435,8 @@ "resolved": "https://registry.npmjs.org/realize-package-specifier/-/realize-package-specifier-3.0.1.tgz" }, "request": { - "version": "2.60.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.60.0.tgz", + "version": "2.61.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.61.0.tgz", "dependencies": { "aws-sign2": { "version": "0.5.0", @@ -7095,12 +6497,12 @@ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { - "version": "1.0.0-rc2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc2.tgz", + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { "async": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.4.0.tgz" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz" } } }, @@ -7113,8 +6515,8 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz" }, "chalk": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.0.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { "version": "2.1.0", @@ -7161,8 +6563,8 @@ } }, "is-my-json-valid": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.0.tgz", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.1.tgz", "dependencies": { "generate-function": { "version": "2.0.0", @@ -7239,12 +6641,12 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.3.tgz", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.5.tgz", "dependencies": { "mime-db": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.15.0.tgz" + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.17.0.tgz" } } }, @@ -7279,8 +6681,8 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz" }, "rimraf": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.2.tgz" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz" }, "semver": { "version": "5.0.1", @@ -7315,8 +6717,8 @@ } }, "tar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.1.1.tgz" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.0.tgz" }, "text-table": { "version": "0.2.0", @@ -7331,12 +6733,32 @@ "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz" }, "validate-npm-package-license": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-2.0.0.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "dependencies": { "spdx-correct": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.1.tgz", + "dependencies": { + "spdx-license-ids": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.0.2.tgz" + } + } + }, + "spdx-expression-parse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.0.tgz", + "dependencies": { + "spdx-exceptions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.2.tgz" + }, + "spdx-license-ids": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.0.2.tgz" + } + } } } }, @@ -7387,8 +6809,8 @@ "resolved": "https://registry.npmjs.org/read-json/-/read-json-0.1.0.tgz" }, "rimraf": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.2.tgz" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz" }, "run-parallel": { "version": "1.1.2", @@ -7547,8 +6969,8 @@ } }, "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "object-assign": { "version": "3.0.0", diff --git a/test-infra/requirements.txt b/test-infra/requirements.txt deleted file mode 100644 index fe44343da..000000000 --- a/test-infra/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -boto==2.25.0 diff --git a/test-infra/s3_cache.py b/test-infra/s3_cache.py deleted file mode 100755 index eaa37992d..000000000 --- a/test-infra/s3_cache.py +++ /dev/null @@ -1,184 +0,0 @@ -#!/usr/bin/env python2.7 -# pylint: disable=C0301 -from __future__ import absolute_import, unicode_literals, print_function, division - -from sys import argv -from os import environ, stat, chdir, remove as _delete_file -from os.path import dirname, basename, abspath, realpath, expandvars -from hashlib import sha256 -from subprocess import check_call as run -from json import load, dump as save -from contextlib import contextmanager -from datetime import datetime - -from boto.s3.connection import S3Connection -from boto.s3.key import Key -from boto.exception import S3ResponseError - - -CONFIG_FILE = './S3Cachefile.json' -UPLOAD_TODO_FILE = './S3CacheTodo.json' -BYTES_PER_MB = 1024 * 1024 - - -@contextmanager -def timer(): - start = datetime.utcnow() - yield - end = datetime.utcnow() - elapsed = end - start - print("\tDone. Took", int(elapsed.total_seconds()), "second(s).") - - -@contextmanager -def todo_file(writeback=True): - try: - with open(UPLOAD_TODO_FILE, 'rt') as json_file: - todo = load(json_file) - except (IOError, OSError, ValueError): - todo = {} - - yield todo - - if writeback: - try: - with open(UPLOAD_TODO_FILE, 'wt') as json_file: - save(todo, json_file) - except (OSError, IOError) as save_err: - print("Error saving {}:".format(UPLOAD_TODO_FILE), save_err) - - -def _sha256_of_file(filename): - hasher = sha256() - with open(filename, 'rb') as input_file: - hasher.update(input_file.read()) - file_hash = hasher.hexdigest() - print('sha256({}) = {}'.format(filename, file_hash)) - return file_hash - - -def _delete_file_quietly(filename): - try: - _delete_file(filename) - except (OSError, IOError): - pass - - -def mark_needs_uploading(cache_name): - with todo_file() as todo: - todo[cache_name] = True - - -def mark_uploaded(cache_name): - with todo_file() as todo: - todo.pop(cache_name, None) - - -def need_to_upload(cache_name): - with todo_file(writeback=False) as todo: - return todo.get(cache_name, False) - - -def _tarball_size(directory): - kib = stat(_tarball_filename_for(directory)).st_size // BYTES_PER_MB - return "{} MiB".format(kib) - - -def _tarball_filename_for(directory): - return abspath('./{}.tar.gz'.format(basename(directory))) - - -def _create_tarball(directory): - print("Creating tarball of {}...".format(directory)) - with timer(): - run(['tar', '-czf', _tarball_filename_for(directory), '-C', dirname(directory), basename(directory)]) - - -def _extract_tarball(directory): - print("Extracting tarball of {}...".format(directory)) - with timer(): - run(['tar', '-xzf', _tarball_filename_for(directory), '-C', dirname(directory)]) - - -def download(directory): - mark_uploaded(cache_name) # reset - try: - print("Downloading {} tarball from S3...".format(cache_name)) - with timer(): - key.get_contents_to_filename(_tarball_filename_for(directory)) - except S3ResponseError as err: - mark_needs_uploading(cache_name) - raise SystemExit("Cached {} download failed!".format(cache_name)) - print("Downloaded {}.".format(_tarball_size(directory))) - _extract_tarball(directory) - print("{} successfully installed from cache.".format(cache_name)) - - -def upload(directory): - _create_tarball(directory) - print("Uploading {} tarball to S3... ({})".format(cache_name, _tarball_size(directory))) - with timer(): - key.set_contents_from_filename(_tarball_filename_for(directory)) - print("{} cache successfully updated.".format(cache_name)) - mark_uploaded(cache_name) - - -if __name__ == '__main__': - # Uses environment variables: - # AWS_ACCESS_KEY_ID -- AWS Access Key ID - # AWS_SECRET_ACCESS_KEY -- AWS Secret Access Key - argv.pop(0) - if len(argv) != 2: - raise SystemExit("USAGE: s3_cache.py <download | upload> <cache name>") - mode, cache_name = argv - script_dir = dirname(realpath(__file__)) - chdir(script_dir) - try: - with open(CONFIG_FILE, 'rt') as config_file: - config = load(config_file) - except (IOError, OSError, ValueError) as config_err: - print(config_err) - raise SystemExit("Error when trying to load config from JSON file!") - - try: - cache_info = config[cache_name] - key_file = expandvars(cache_info["key"]) - fallback_cmd = cache_info["generate"] - directory = expandvars(cache_info["cache"]) - except (TypeError, KeyError) as load_err: - print(load_err) - raise SystemExit("Config for cache named {!r} is missing or malformed!".format(cache_name)) - - try: - try: - BUCKET_NAME = environ['TWBS_S3_BUCKET'] - except KeyError: - raise SystemExit("TWBS_S3_BUCKET environment variable not set!") - - conn = S3Connection() - bucket = conn.lookup(BUCKET_NAME) - if bucket is None: - raise SystemExit("Could not access bucket!") - - key_file_hash = _sha256_of_file(key_file) - - key = Key(bucket, key_file_hash) - key.storage_class = 'REDUCED_REDUNDANCY' - - if mode == 'download': - download(directory) - elif mode == 'upload': - if need_to_upload(cache_name): - upload(directory) - else: - print("No need to upload anything.") - else: - raise SystemExit("Unrecognized mode {!r}".format(mode)) - except BaseException as exc: - if mode != 'download': - raise - print("Error!:", exc) - print("Unable to download from cache.") - print("Running fallback command to generate cache directory {!r}: {}".format(directory, fallback_cmd)) - with timer(): - run(fallback_cmd, shell=True) diff --git a/test-infra/uncached-npm-install.sh b/test-infra/uncached-npm-install.sh deleted file mode 100755 index a2d41445d..000000000 --- a/test-infra/uncached-npm-install.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e -cd .. # /bootstrap/ -cp test-infra/npm-shrinkwrap.json npm-shrinkwrap.json -# npm is flaky, so try multiple times -MAXTRIES=3 -TRIES=1 -while ! npm install; do - if [ $TRIES -ge $MAXTRIES ]; then - exit 1 - fi - TRIES=$(($TRIES + 1)) - echo "Retrying npm install (Try $TRIES of $MAXTRIES)..." -done -rm npm-shrinkwrap.json |
