kanpachi 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/bower.json +1 -0
- data/kanpachi.gemspec +1 -1
- data/lib/kanpachi/doc/template/components/bootstrap/.bower.json +34 -0
- data/lib/kanpachi/doc/template/components/bootstrap/Gruntfile.js +421 -0
- data/lib/kanpachi/doc/template/components/bootstrap/LICENSE +21 -0
- data/lib/kanpachi/doc/template/components/bootstrap/README.md +173 -0
- data/lib/kanpachi/doc/template/components/bootstrap/bower.json +24 -0
- data/lib/kanpachi/doc/template/{source/stylesheets → components/bootstrap/dist/css}/bootstrap-theme.css +0 -0
- data/lib/kanpachi/doc/template/{source/stylesheets → components/bootstrap/dist/css}/bootstrap-theme.css.map +0 -0
- data/lib/kanpachi/doc/template/{source/stylesheets → components/bootstrap/dist/css}/bootstrap-theme.min.css +0 -0
- data/lib/kanpachi/doc/template/{source/stylesheets → components/bootstrap/dist/css}/bootstrap.css +0 -0
- data/lib/kanpachi/doc/template/{source/stylesheets → components/bootstrap/dist/css}/bootstrap.css.map +0 -0
- data/lib/kanpachi/doc/template/{source/stylesheets → components/bootstrap/dist/css}/bootstrap.min.css +0 -0
- data/lib/kanpachi/doc/template/components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/kanpachi/doc/template/components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +229 -0
- data/lib/kanpachi/doc/template/components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/kanpachi/doc/template/components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/kanpachi/doc/template/{source/javascripts → components/bootstrap/dist/js}/bootstrap.js +0 -0
- data/lib/kanpachi/doc/template/{source/javascripts → components/bootstrap/dist/js}/bootstrap.min.js +0 -0
- data/lib/kanpachi/doc/template/components/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/kanpachi/doc/template/components/bootstrap/fonts/glyphicons-halflings-regular.svg +229 -0
- data/lib/kanpachi/doc/template/components/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/kanpachi/doc/template/components/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/kanpachi/doc/template/components/bootstrap/grunt/bs-glyphicons-data-generator.js +34 -0
- data/lib/kanpachi/doc/template/components/bootstrap/grunt/bs-lessdoc-parser.js +236 -0
- data/lib/kanpachi/doc/template/components/bootstrap/grunt/bs-raw-files-generator.js +31 -0
- data/lib/kanpachi/doc/template/components/bootstrap/grunt/shrinkwrap.js +28 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/affix.js +137 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/alert.js +88 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/button.js +107 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/carousel.js +205 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/collapse.js +170 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/dropdown.js +147 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/modal.js +243 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/popover.js +110 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/scrollspy.js +153 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/tab.js +125 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/tooltip.js +399 -0
- data/lib/kanpachi/doc/template/components/bootstrap/js/transition.js +48 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/alerts.less +67 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/badges.less +55 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/bootstrap.less +49 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/breadcrumbs.less +26 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/button-groups.less +226 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/buttons.less +159 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/carousel.less +232 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/close.less +33 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/code.less +63 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/component-animations.less +29 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/dropdowns.less +213 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/forms.less +438 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/glyphicons.less +233 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/grid.less +84 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/input-groups.less +162 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/jumbotron.less +44 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/labels.less +64 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/list-group.less +110 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/media.less +56 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/mixins.less +929 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/modals.less +139 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/navbar.less +616 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/navs.less +242 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/normalize.less +423 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/pager.less +55 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/pagination.less +88 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/panels.less +241 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/popovers.less +133 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/print.less +101 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/progress-bars.less +80 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/responsive-utilities.less +92 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/scaffolding.less +134 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/tables.less +233 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/theme.less +247 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/thumbnails.less +36 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/tooltip.less +95 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/type.less +293 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/utilities.less +56 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/variables.less +829 -0
- data/lib/kanpachi/doc/template/components/bootstrap/less/wells.less +29 -0
- data/lib/kanpachi/doc/template/components/bootstrap/package.json +70 -0
- data/lib/kanpachi/doc/template/components/bootstrap/test-infra/README.md +100 -0
- data/lib/kanpachi/doc/template/components/bootstrap/test-infra/npm-shrinkwrap.canonical.json +1 -0
- data/lib/kanpachi/doc/template/components/bootstrap/test-infra/requirements.txt +1 -0
- data/lib/kanpachi/doc/template/components/bootstrap/test-infra/s3_cache.py +107 -0
- data/lib/kanpachi/doc/template/components/bootstrap/test-infra/sauce_browsers.yml +83 -0
- data/lib/kanpachi/doc/template/components/bootstrap/test-infra/uncached-npm-install.sh +4 -0
- data/lib/kanpachi/doc/template/components/html5shiv/.bower.json +6 -7
- data/lib/kanpachi/doc/template/components/html5shiv/Gruntfile.js +61 -0
- data/lib/kanpachi/doc/template/components/html5shiv/bower.json +15 -0
- data/lib/kanpachi/doc/template/components/html5shiv/dist/html5shiv-printshiv.js +498 -10
- data/lib/kanpachi/doc/template/components/html5shiv/dist/html5shiv-printshiv.min.js +4 -0
- data/lib/kanpachi/doc/template/components/html5shiv/dist/html5shiv.js +300 -7
- data/lib/kanpachi/doc/template/components/html5shiv/dist/html5shiv.min.js +4 -0
- data/lib/kanpachi/doc/template/components/html5shiv/package.json +16 -0
- data/lib/kanpachi/doc/template/components/html5shiv/readme.md +3 -3
- data/lib/kanpachi/doc/template/source/javascripts/all.coffee +1 -1
- data/lib/kanpachi/doc/template/source/layouts/layout.slim +1 -1
- data/lib/kanpachi/response.rb +13 -5
- data/lib/kanpachi/version.rb +1 -1
- metadata +93 -12
@@ -0,0 +1,29 @@
|
|
1
|
+
//
|
2
|
+
// Wells
|
3
|
+
// --------------------------------------------------
|
4
|
+
|
5
|
+
|
6
|
+
// Base class
|
7
|
+
.well {
|
8
|
+
min-height: 20px;
|
9
|
+
padding: 19px;
|
10
|
+
margin-bottom: 20px;
|
11
|
+
background-color: @well-bg;
|
12
|
+
border: 1px solid @well-border;
|
13
|
+
border-radius: @border-radius-base;
|
14
|
+
.box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
|
15
|
+
blockquote {
|
16
|
+
border-color: #ddd;
|
17
|
+
border-color: rgba(0,0,0,.15);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
// Sizes
|
22
|
+
.well-lg {
|
23
|
+
padding: 24px;
|
24
|
+
border-radius: @border-radius-large;
|
25
|
+
}
|
26
|
+
.well-sm {
|
27
|
+
padding: 9px;
|
28
|
+
border-radius: @border-radius-small;
|
29
|
+
}
|
@@ -0,0 +1,70 @@
|
|
1
|
+
{
|
2
|
+
"name": "bootstrap",
|
3
|
+
"description": "Sleek, intuitive, and powerful front-end framework for faster and easier web development.",
|
4
|
+
"version": "3.1.1",
|
5
|
+
"keywords": [
|
6
|
+
"bootstrap",
|
7
|
+
"css"
|
8
|
+
],
|
9
|
+
"homepage": "http://getbootstrap.com",
|
10
|
+
"author": "Twitter, Inc.",
|
11
|
+
"scripts": {
|
12
|
+
"test": "grunt test"
|
13
|
+
},
|
14
|
+
"style": "./dist/css/bootstrap.css",
|
15
|
+
"less": "./less/bootstrap.less",
|
16
|
+
"repository": {
|
17
|
+
"type": "git",
|
18
|
+
"url": "https://github.com/twbs/bootstrap.git"
|
19
|
+
},
|
20
|
+
"bugs": {
|
21
|
+
"url": "https://github.com/twbs/bootstrap/issues"
|
22
|
+
},
|
23
|
+
"license": {
|
24
|
+
"type": "MIT",
|
25
|
+
"url": "https://github.com/twbs/bootstrap/blob/master/LICENSE"
|
26
|
+
},
|
27
|
+
"devDependencies": {
|
28
|
+
"btoa": "~1.1.1",
|
29
|
+
"canonical-json": "~0.0.3",
|
30
|
+
"grunt": "~0.4.2",
|
31
|
+
"grunt-banner": "~0.2.0",
|
32
|
+
"grunt-contrib-clean": "~0.5.0",
|
33
|
+
"grunt-contrib-concat": "~0.3.0",
|
34
|
+
"grunt-contrib-connect": "~0.6.0",
|
35
|
+
"grunt-contrib-copy": "~0.5.0",
|
36
|
+
"grunt-contrib-csslint": "~0.2.0",
|
37
|
+
"grunt-contrib-cssmin": "~0.7.0",
|
38
|
+
"grunt-contrib-jade": "~0.9.1",
|
39
|
+
"grunt-contrib-jshint": "~0.8.0",
|
40
|
+
"grunt-contrib-less": "~0.9.0",
|
41
|
+
"grunt-contrib-qunit": "~0.4.0",
|
42
|
+
"grunt-contrib-uglify": "~0.3.0",
|
43
|
+
"grunt-contrib-watch": "~0.5.3",
|
44
|
+
"grunt-csscomb": "~2.0.1",
|
45
|
+
"grunt-exec": "0.4.3",
|
46
|
+
"grunt-html-validation": "~0.1.13",
|
47
|
+
"grunt-jekyll": "~0.4.1",
|
48
|
+
"grunt-jscs-checker": "~0.3.0",
|
49
|
+
"grunt-saucelabs": "~5.0.0",
|
50
|
+
"grunt-sed": "~0.1.1",
|
51
|
+
"load-grunt-tasks": "~0.3.0",
|
52
|
+
"markdown": "~0.5.0"
|
53
|
+
},
|
54
|
+
"jspm": {
|
55
|
+
"main": "js/bootstrap",
|
56
|
+
"directories": {
|
57
|
+
"example": "examples",
|
58
|
+
"lib": "dist"
|
59
|
+
},
|
60
|
+
"shim": {
|
61
|
+
"js/bootstrap": {
|
62
|
+
"imports": "jquery",
|
63
|
+
"exports": "$"
|
64
|
+
}
|
65
|
+
},
|
66
|
+
"buildConfig": {
|
67
|
+
"uglify": true
|
68
|
+
}
|
69
|
+
}
|
70
|
+
}
|
@@ -0,0 +1,100 @@
|
|
1
|
+
## What does `s3_cache.py` do?
|
2
|
+
|
3
|
+
### In general
|
4
|
+
`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.
|
5
|
+
|
6
|
+
The SHA-256 hash of the single file is used as the key for the cache. The directory is stored as a gzipped tarball.
|
7
|
+
|
8
|
+
All the tarballs are stored in S3's Reduced Redundancy Storage (RRS) storage class, since this is cheaper and the data is non-critical.
|
9
|
+
|
10
|
+
`s3_cache.py` itself never deletes cache entries; deletion should either be done manually or using automatic S3 lifecycle rules on the bucket.
|
11
|
+
|
12
|
+
Similar to git, `s3_cache.py` makes the assumption that [SHA-256 will effectively never have a collision](http://stackoverflow.com/questions/4014090/is-it-safe-to-ignore-the-possibility-of-sha-collisions-in-practice).
|
13
|
+
|
14
|
+
|
15
|
+
### For Bootstrap specifically
|
16
|
+
`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.)
|
17
|
+
|
18
|
+
For npm, the `node_modules` directory is cached based on our `npm-shrinkwrap.canonical.json` file.
|
19
|
+
|
20
|
+
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.
|
21
|
+
`pseudo_Gemfile.lock` contains the versions of Ruby and Jekyll that we're using (read our `.travis.yml` for details).
|
22
|
+
|
23
|
+
|
24
|
+
## Why is `s3_cache.py` necessary?
|
25
|
+
`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.
|
26
|
+
|
27
|
+
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.
|
28
|
+
|
29
|
+
|
30
|
+
## Setup
|
31
|
+
|
32
|
+
### Overview
|
33
|
+
1. Create an Amazon Web Services (AWS) account.
|
34
|
+
2. Create an Identity & Access Management (IAM) user, and note their credentials.
|
35
|
+
3. Create an S3 bucket.
|
36
|
+
4. Set permissions on the bucket to grant the user read+write access.
|
37
|
+
5. Set the user credentials as secure Travis environment variables.
|
38
|
+
|
39
|
+
### In detail
|
40
|
+
1. Create an AWS account.
|
41
|
+
2. Login to the [AWS Management Console](https://console.aws.amazon.com).
|
42
|
+
3. Go to the IAM Management Console.
|
43
|
+
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.
|
44
|
+
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`
|
45
|
+
6. Note the user's access key, which can be found in the "Security Credentials" tab of the user browser.
|
46
|
+
7. Go to the S3 Management Console.
|
47
|
+
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:
|
48
|
+
|
49
|
+
```bash
|
50
|
+
python -c "import uuid; print(uuid.uuid4())"
|
51
|
+
```
|
52
|
+
|
53
|
+
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`
|
54
|
+
10. In the bucket's Properties pane, in the "Permissions" section, click the "Edit bucket policy" button.
|
55
|
+
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:
|
56
|
+
|
57
|
+
```json
|
58
|
+
{
|
59
|
+
"Version": "2012-10-17",
|
60
|
+
"Id": "PolicyTravisReadWriteNoAdmin",
|
61
|
+
"Statement": [
|
62
|
+
{
|
63
|
+
"Sid": "StmtXXXXXXXXXXXXXX",
|
64
|
+
"Effect": "Allow",
|
65
|
+
"Principal": {
|
66
|
+
"AWS": "arn:aws:iam::XXXXXXXXXXXXXX:user/travis-ci"
|
67
|
+
},
|
68
|
+
"Action": [
|
69
|
+
"s3:AbortMultipartUpload",
|
70
|
+
"s3:GetObjectVersion",
|
71
|
+
"s3:ListBucket",
|
72
|
+
"s3:DeleteObject",
|
73
|
+
"s3:DeleteObjectVersion",
|
74
|
+
"s3:GetObject",
|
75
|
+
"s3:PutObject"
|
76
|
+
],
|
77
|
+
"Resource": [
|
78
|
+
"arn:aws:s3:::XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
|
79
|
+
"arn:aws:s3:::XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/*"
|
80
|
+
]
|
81
|
+
}
|
82
|
+
]
|
83
|
+
}
|
84
|
+
```
|
85
|
+
|
86
|
+
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.
|
87
|
+
13. Install the [`travis` RubyGem](https://github.com/travis-ci/travis): `gem install travis`
|
88
|
+
14. Encrypt the environment variables:
|
89
|
+
|
90
|
+
```bash
|
91
|
+
travis encrypt --repo twbs/bootstrap "AWS_ACCESS_KEY_ID=XXX"
|
92
|
+
travis encrypt --repo twbs/bootstrap "AWS_SECRET_ACCESS_KEY=XXX"
|
93
|
+
travis encrypt --repo twbs/bootstrap "TWBS_S3_BUCKET=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
|
94
|
+
```
|
95
|
+
|
96
|
+
14. Add the resulting secure environment variables to `.travis.yml`.
|
97
|
+
|
98
|
+
|
99
|
+
## Usage
|
100
|
+
Read `s3_cache.py`'s source code and Bootstrap's `.travis.yml` for how to invoke and make use of `s3_cache.py`.
|
@@ -0,0 +1 @@
|
|
1
|
+
{"dependencies":{"btoa":{"from":"btoa@~1.1.1","version":"1.1.1"},"canonical-json":{"from":"canonical-json@~0.0.3","version":"0.0.4"},"grunt":{"dependencies":{"async":{"from":"async@~0.1.22","version":"0.1.22"},"coffee-script":{"from":"coffee-script@~1.3.3","version":"1.3.3"},"colors":{"from":"colors@~0.6.0","version":"0.6.2"},"dateformat":{"from":"dateformat@1.0.2-1.2.3","version":"1.0.2-1.2.3"},"eventemitter2":{"from":"eventemitter2@~0.4.13","version":"0.4.13"},"exit":{"from":"exit@~0.1.1","version":"0.1.2"},"findup-sync":{"dependencies":{"lodash":{"from":"lodash@~1.0.1","version":"1.0.1"}},"from":"findup-sync@~0.1.2","version":"0.1.2"},"getobject":{"from":"getobject@~0.1.0","version":"0.1.0"},"glob":{"dependencies":{"graceful-fs":{"from":"graceful-fs@~1.2.0","version":"1.2.3"},"inherits":{"from":"inherits@1","version":"1.0.0"}},"from":"glob@~3.1.21","version":"3.1.21"},"hooker":{"from":"hooker@~0.2.3","version":"0.2.3"},"iconv-lite":{"from":"iconv-lite@~0.2.11","version":"0.2.11"},"js-yaml":{"dependencies":{"argparse":{"dependencies":{"underscore":{"from":"underscore@1.4.x","version":"1.4.4"},"underscore.string":{"from":"underscore.string@~2.3.1","version":"2.3.3"}},"from":"argparse@~ 0.1.11","version":"0.1.15"},"esprima":{"from":"esprima@~ 1.0.2","version":"1.0.4"}},"from":"js-yaml@~2.0.5","version":"2.0.5"},"lodash":{"from":"lodash@~0.9.2","version":"0.9.2"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@~0.2.9","version":"0.2.14"},"nopt":{"dependencies":{"abbrev":{"from":"abbrev@1","version":"1.0.4"}},"from":"nopt@~1.0.10","version":"1.0.10"},"rimraf":{"dependencies":{"graceful-fs":{"from":"graceful-fs@~1.1","version":"1.1.14"}},"from":"rimraf@~2.0.3","version":"2.0.3"},"underscore.string":{"from":"underscore.string@~2.2.1","version":"2.2.1"},"which":{"from":"which@~1.0.5","version":"1.0.5"}},"from":"grunt@~0.4.2","version":"0.4.2"},"grunt-banner":{"from":"grunt-banner@~0.2.0","version":"0.2.0"},"grunt-contrib-clean":{"dependencies":{"rimraf":{"from":"rimraf@~2.2.1","version":"2.2.6"}},"from":"grunt-contrib-clean@~0.5.0","version":"0.5.0"},"grunt-contrib-concat":{"from":"grunt-contrib-concat@~0.3.0","version":"0.3.0"},"grunt-contrib-connect":{"dependencies":{"connect":{"dependencies":{"batch":{"from":"batch@0.5.0","version":"0.5.0"},"buffer-crc32":{"from":"buffer-crc32@0.2.1","version":"0.2.1"},"bytes":{"from":"bytes@0.2.1","version":"0.2.1"},"cookie":{"from":"cookie@0.1.0","version":"0.1.0"},"cookie-signature":{"from":"cookie-signature@1.0.1","version":"1.0.1"},"debug":{"from":"debug@>= 0.7.3 < 1","version":"0.7.4"},"fresh":{"from":"fresh@0.2.0","version":"0.2.0"},"methods":{"from":"methods@0.1.0","version":"0.1.0"},"multiparty":{"dependencies":{"readable-stream":{"dependencies":{"core-util-is":{"from":"core-util-is@~1.0.0","version":"1.0.1"},"debuglog":{"from":"debuglog@0.0.2","version":"0.0.2"}},"from":"readable-stream@~1.1.9","version":"1.1.10"},"stream-counter":{"from":"stream-counter@~0.2.0","version":"0.2.0"}},"from":"multiparty@2.2.0","version":"2.2.0"},"negotiator":{"from":"negotiator@0.3.0","version":"0.3.0"},"pause":{"from":"pause@0.0.1","version":"0.0.1"},"qs":{"from":"qs@0.6.6","version":"0.6.6"},"raw-body":{"from":"raw-body@1.1.2","version":"1.1.2"},"send":{"dependencies":{"mime":{"from":"mime@~1.2.9","version":"1.2.11"},"range-parser":{"from":"range-parser@0.0.4","version":"0.0.4"}},"from":"send@0.1.4","version":"0.1.4"},"uid2":{"from":"uid2@0.0.3","version":"0.0.3"}},"from":"connect@~2.12.0","version":"2.12.0"},"connect-livereload":{"from":"connect-livereload@~0.3.0","version":"0.3.2"},"open":{"from":"open@0.0.4","version":"0.0.4"}},"from":"grunt-contrib-connect@~0.6.0","version":"0.6.0"},"grunt-contrib-copy":{"from":"grunt-contrib-copy@~0.5.0","version":"0.5.0"},"grunt-contrib-csslint":{"dependencies":{"csslint":{"dependencies":{"parserlib":{"from":"parserlib@~0.2.2","version":"0.2.4"}},"from":"csslint@~0.10.0","version":"0.10.0"}},"from":"grunt-contrib-csslint@~0.2.0","version":"0.2.0"},"grunt-contrib-cssmin":{"dependencies":{"clean-css":{"dependencies":{"commander":{"from":"commander@2.0.x","version":"2.0.0"}},"from":"clean-css@~2.0.0","version":"2.0.8"},"grunt-lib-contrib":{"dependencies":{"zlib-browserify":{"from":"zlib-browserify@0.0.1","version":"0.0.1"}},"from":"grunt-lib-contrib@~0.6.0","version":"0.6.1"}},"from":"grunt-contrib-cssmin@~0.7.0","version":"0.7.0"},"grunt-contrib-jade":{"dependencies":{"grunt-lib-contrib":{"dependencies":{"zlib-browserify":{"from":"zlib-browserify@0.0.1","version":"0.0.1"}},"from":"grunt-lib-contrib@~0.6.1","version":"0.6.1"},"jade":{"dependencies":{"character-parser":{"from":"character-parser@1.2.0","version":"1.2.0"},"commander":{"from":"commander@2.0.0","version":"2.0.0"},"constantinople":{"dependencies":{"uglify-js":{"dependencies":{"async":{"from":"async@~0.2.6","version":"0.2.10"},"optimist":{"dependencies":{"wordwrap":{"from":"wordwrap@~0.0.2","version":"0.0.2"}},"from":"optimist@~0.3.5","version":"0.3.7"},"source-map":{"dependencies":{"amdefine":{"from":"amdefine@>=0.0.4","version":"0.1.0"}},"from":"source-map@~0.1.7","version":"0.1.31"},"uglify-to-browserify":{"from":"uglify-to-browserify@~1.0.0","version":"1.0.2"}},"from":"uglify-js@~2.4.0","version":"2.4.12"}},"from":"constantinople@~1.0.2","version":"1.0.2"},"mkdirp":{"from":"mkdirp@~0.3.5","version":"0.3.5"},"monocle":{"dependencies":{"readdirp":{"dependencies":{"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@>=0.2.4","version":"0.2.14"}},"from":"readdirp@~0.2.3","version":"0.2.5"}},"from":"monocle@1.1.50","version":"1.1.50"},"transformers":{"dependencies":{"css":{"dependencies":{"css-parse":{"from":"css-parse@1.0.4","version":"1.0.4"},"css-stringify":{"from":"css-stringify@1.0.5","version":"1.0.5"}},"from":"css@~1.0.8","version":"1.0.8"},"promise":{"dependencies":{"is-promise":{"from":"is-promise@~1","version":"1.0.0"}},"from":"promise@~2.0","version":"2.0.0"},"uglify-js":{"dependencies":{"optimist":{"dependencies":{"wordwrap":{"from":"wordwrap@~0.0.2","version":"0.0.2"}},"from":"optimist@~0.3.5","version":"0.3.7"},"source-map":{"dependencies":{"amdefine":{"from":"amdefine@>=0.0.4","version":"0.1.0"}},"from":"source-map@~0.1.7","version":"0.1.31"}},"from":"uglify-js@~2.2.5","version":"2.2.5"}},"from":"transformers@2.1.0","resolved":"https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz","version":"2.1.0"},"with":{"dependencies":{"uglify-js":{"dependencies":{"async":{"from":"async@~0.2.6","version":"0.2.10"},"optimist":{"dependencies":{"wordwrap":{"from":"wordwrap@~0.0.2","version":"0.0.2"}},"from":"optimist@~0.3.5","version":"0.3.7"},"source-map":{"dependencies":{"amdefine":{"from":"amdefine@>=0.0.4","version":"0.1.0"}},"from":"source-map@~0.1.7","version":"0.1.31"},"uglify-to-browserify":{"from":"uglify-to-browserify@~1.0.0","version":"1.0.2"}},"from":"uglify-js@2.4.0","version":"2.4.0"}},"from":"with@~2.0.0","version":"2.0.0"}},"from":"jade@~1.0.2","version":"1.0.2"},"lodash-node":{"from":"lodash-node@~2.4.1","version":"2.4.1"}},"from":"grunt-contrib-jade@~0.9.1","version":"0.9.1"},"grunt-contrib-jshint":{"dependencies":{"jshint":{"dependencies":{"cli":{"dependencies":{"glob":{"dependencies":{"inherits":{"from":"inherits@2","version":"2.0.1"}},"from":"glob@>= 3.1.4","version":"3.2.8"}},"from":"cli@0.4.x","version":"0.4.5"},"console-browserify":{"from":"console-browserify@0.1.x","version":"0.1.6"},"htmlparser2":{"dependencies":{"domelementtype":{"from":"domelementtype@1","version":"1.1.1"},"domhandler":{"from":"domhandler@2.1","version":"2.1.0"},"domutils":{"from":"domutils@1.1","version":"1.1.6"},"readable-stream":{"dependencies":{"string_decoder":{"from":"string_decoder@~0.10.x","version":"0.10.25"}},"from":"readable-stream@1.0","version":"1.0.25"}},"from":"htmlparser2@3.3.x","version":"3.3.0"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@0.x.x","version":"0.2.14"},"shelljs":{"from":"shelljs@0.1.x","version":"0.1.4"},"underscore":{"from":"underscore@1.4.x","version":"1.4.4"}},"from":"jshint@~2.4.0","version":"2.4.3"}},"from":"grunt-contrib-jshint@~0.8.0","version":"0.8.0"},"grunt-contrib-less":{"dependencies":{"chalk":{"dependencies":{"ansi-styles":{"from":"ansi-styles@~1.0.0","version":"1.0.0"},"has-color":{"from":"has-color@~0.1.0","version":"0.1.4"},"strip-ansi":{"from":"strip-ansi@~0.1.0","version":"0.1.1"}},"from":"chalk@~0.4.0","version":"0.4.0"},"grunt-lib-contrib":{"dependencies":{"zlib-browserify":{"from":"zlib-browserify@0.0.1","version":"0.0.1"}},"from":"grunt-lib-contrib@~0.6.1","version":"0.6.1"},"less":{"dependencies":{"clean-css":{"dependencies":{"commander":{"from":"commander@2.0.x","version":"2.0.0"}},"from":"clean-css@2.0.x","version":"2.0.8"},"mime":{"from":"mime@1.2.x","version":"1.2.11"},"mkdirp":{"from":"mkdirp@~0.3.5","version":"0.3.5"},"request":{"dependencies":{"aws-sign2":{"from":"aws-sign2@~0.5.0","version":"0.5.0"},"forever-agent":{"from":"forever-agent@~0.5.0","version":"0.5.2"},"form-data":{"dependencies":{"async":{"from":"async@~0.2.9","version":"0.2.10"},"combined-stream":{"dependencies":{"delayed-stream":{"from":"delayed-stream@0.0.5","version":"0.0.5"}},"from":"combined-stream@~0.0.4","version":"0.0.4"}},"from":"form-data@~0.1.0","version":"0.1.2"},"hawk":{"dependencies":{"boom":{"from":"boom@0.4.x","version":"0.4.2"},"cryptiles":{"from":"cryptiles@0.2.x","version":"0.2.2"},"hoek":{"from":"hoek@0.9.x","version":"0.9.1"},"sntp":{"from":"sntp@0.2.x","version":"0.2.4"}},"from":"hawk@~1.0.0","version":"1.0.0"},"http-signature":{"dependencies":{"asn1":{"from":"asn1@0.1.11","version":"0.1.11"},"assert-plus":{"from":"assert-plus@0.1.2","version":"0.1.2"},"ctype":{"from":"ctype@0.5.2","version":"0.5.2"}},"from":"http-signature@~0.10.0","version":"0.10.0"},"json-stringify-safe":{"from":"json-stringify-safe@~5.0.0","version":"5.0.0"},"node-uuid":{"from":"node-uuid@~1.4.0","version":"1.4.1"},"oauth-sign":{"from":"oauth-sign@~0.3.0","version":"0.3.0"},"qs":{"from":"qs@~0.6.0","version":"0.6.6"},"tough-cookie":{"dependencies":{"punycode":{"from":"punycode@>=0.2.0","version":"1.2.3"}},"from":"tough-cookie@>=0.12.0","version":"0.12.1"},"tunnel-agent":{"from":"tunnel-agent@~0.3.0","version":"0.3.0"}},"from":"request@>=2.12.0","version":"2.33.0"},"source-map":{"dependencies":{"amdefine":{"from":"amdefine@>=0.0.4","version":"0.1.0"}},"from":"source-map@0.1.x","version":"0.1.31"}},"from":"less@~1.6.0","version":"1.6.3"}},"from":"grunt-contrib-less@~0.9.0","version":"0.9.0"},"grunt-contrib-qunit":{"dependencies":{"grunt-lib-phantomjs":{"dependencies":{"eventemitter2":{"from":"eventemitter2@~0.4.9","version":"0.4.13"},"phantomjs":{"dependencies":{"adm-zip":{"from":"adm-zip@0.2.1","version":"0.2.1"},"kew":{"from":"kew@~0.1.7","version":"0.1.7"},"mkdirp":{"from":"mkdirp@0.3.5","version":"0.3.5"},"ncp":{"from":"ncp@0.4.2","version":"0.4.2"},"npmconf":{"dependencies":{"config-chain":{"dependencies":{"proto-list":{"from":"proto-list@~1.2.1","version":"1.2.2"}},"from":"config-chain@~1.1.1","version":"1.1.8"},"inherits":{"from":"inherits@~1.0.0","version":"1.0.0"},"ini":{"from":"ini@~1.1.0","version":"1.1.0"},"nopt":{"dependencies":{"abbrev":{"from":"abbrev@1","version":"1.0.4"}},"from":"nopt@2","version":"2.1.2"},"once":{"from":"once@~1.1.1","version":"1.1.1"},"osenv":{"from":"osenv@0.0.3","version":"0.0.3"},"semver":{"from":"semver@~1.1.0","version":"1.1.4"}},"from":"npmconf@0.0.24","version":"0.0.24"},"rimraf":{"from":"rimraf@~2.2.2","version":"2.2.6"},"which":{"from":"which@~1.0.5","version":"1.0.5"}},"from":"phantomjs@~1.9.0-1","version":"1.9.7-1"},"semver":{"from":"semver@~1.0.14","version":"1.0.14"},"temporary":{"dependencies":{"package":{"from":"package@>= 1.0.0 < 1.2.0","version":"1.0.1"}},"from":"temporary@~0.0.4","version":"0.0.8"}},"from":"grunt-lib-phantomjs@~0.5.0","version":"0.5.0"}},"from":"grunt-contrib-qunit@~0.4.0","version":"0.4.0"},"grunt-contrib-uglify":{"dependencies":{"chalk":{"dependencies":{"ansi-styles":{"from":"ansi-styles@~1.0.0","version":"1.0.0"},"has-color":{"from":"has-color@~0.1.0","version":"0.1.4"},"strip-ansi":{"from":"strip-ansi@~0.1.0","version":"0.1.1"}},"from":"chalk@~0.4.0","version":"0.4.0"},"grunt-lib-contrib":{"dependencies":{"zlib-browserify":{"from":"zlib-browserify@0.0.1","version":"0.0.1"}},"from":"grunt-lib-contrib@~0.6.1","version":"0.6.1"},"uglify-js":{"dependencies":{"async":{"from":"async@~0.2.6","version":"0.2.10"},"optimist":{"dependencies":{"wordwrap":{"from":"wordwrap@~0.0.2","version":"0.0.2"}},"from":"optimist@~0.3.5","version":"0.3.7"},"source-map":{"dependencies":{"amdefine":{"from":"amdefine@>=0.0.4","version":"0.1.0"}},"from":"source-map@~0.1.7","version":"0.1.31"},"uglify-to-browserify":{"from":"uglify-to-browserify@~1.0.0","version":"1.0.2"}},"from":"uglify-js@~2.4.0","version":"2.4.12"}},"from":"grunt-contrib-uglify@~0.3.0","version":"0.3.2"},"grunt-contrib-watch":{"dependencies":{"gaze":{"dependencies":{"globule":{"dependencies":{"glob":{"dependencies":{"graceful-fs":{"from":"graceful-fs@~1.2.0","version":"1.2.3"},"inherits":{"from":"inherits@1","version":"1.0.0"}},"from":"glob@~3.1.21","version":"3.1.21"},"lodash":{"from":"lodash@~1.0.1","version":"1.0.1"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@~0.2.11","version":"0.2.14"}},"from":"globule@~0.1.0","version":"0.1.0"}},"from":"gaze@~0.4.0","version":"0.4.3"},"tiny-lr":{"dependencies":{"debug":{"from":"debug@~0.7.2","version":"0.7.4"},"faye-websocket":{"from":"faye-websocket@~0.4.3","version":"0.4.4"},"noptify":{"dependencies":{"nopt":{"dependencies":{"abbrev":{"from":"abbrev@1","version":"1.0.4"}},"from":"nopt@~2.0.0","version":"2.0.0"}},"from":"noptify@latest","version":"0.0.3"},"qs":{"from":"qs@~0.5.2","version":"0.5.6"}},"from":"tiny-lr@0.0.4","version":"0.0.4"}},"from":"grunt-contrib-watch@~0.5.3","version":"0.5.3"},"grunt-csscomb":{"dependencies":{"csscomb":{"dependencies":{"commander":{"from":"commander@2.0.0","version":"2.0.0"},"gonzales-pe":{"from":"gonzales-pe@2.0.x","version":"2.0.2"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@0.2.12","version":"0.2.12"},"vow":{"from":"vow@0.3.11","version":"0.3.11"},"vow-fs":{"dependencies":{"node-uuid":{"from":"node-uuid@1.4.0","version":"1.4.0"},"vow-queue":{"from":"vow-queue@0.0.2","version":"0.0.2"}},"from":"vow-fs@0.2.3","version":"0.2.3"}},"from":"csscomb@~2.0.0","version":"2.0.4"}},"from":"grunt-csscomb@~2.0.1","version":"2.0.1"},"grunt-exec":{"from":"grunt-exec@0.4.3","version":"0.4.3"},"grunt-html-validation":{"dependencies":{"colors":{"from":"colors@~0.6.0","version":"0.6.2"},"request":{"dependencies":{"aws-sign":{"from":"aws-sign@~0.3.0","version":"0.3.0"},"cookie-jar":{"from":"cookie-jar@~0.3.0","version":"0.3.0"},"forever-agent":{"from":"forever-agent@~0.5.0","version":"0.5.2"},"form-data":{"dependencies":{"async":{"from":"async@~0.2.9","version":"0.2.10"},"combined-stream":{"dependencies":{"delayed-stream":{"from":"delayed-stream@0.0.5","version":"0.0.5"}},"from":"combined-stream@~0.0.4","version":"0.0.4"}},"from":"form-data@~0.1.0","version":"0.1.2"},"hawk":{"dependencies":{"boom":{"from":"boom@0.4.x","version":"0.4.2"},"cryptiles":{"from":"cryptiles@0.2.x","version":"0.2.2"},"hoek":{"from":"hoek@0.9.x","version":"0.9.1"},"sntp":{"from":"sntp@0.2.x","version":"0.2.4"}},"from":"hawk@~1.0.0","version":"1.0.0"},"http-signature":{"dependencies":{"asn1":{"from":"asn1@0.1.11","version":"0.1.11"},"assert-plus":{"from":"assert-plus@0.1.2","version":"0.1.2"},"ctype":{"from":"ctype@0.5.2","version":"0.5.2"}},"from":"http-signature@~0.10.0","version":"0.10.0"},"json-stringify-safe":{"from":"json-stringify-safe@~5.0.0","version":"5.0.0"},"mime":{"from":"mime@~1.2.9","version":"1.2.11"},"node-uuid":{"from":"node-uuid@~1.4.0","version":"1.4.1"},"oauth-sign":{"from":"oauth-sign@~0.3.0","version":"0.3.0"},"qs":{"from":"qs@~0.6.0","version":"0.6.6"},"tunnel-agent":{"from":"tunnel-agent@~0.3.0","version":"0.3.0"}},"from":"request@~2.27.0","version":"2.27.0"},"w3cjs":{"dependencies":{"commander":{"from":"commander@2.0.x","version":"2.0.0"},"superagent":{"dependencies":{"cookiejar":{"from":"cookiejar@1.3.0","version":"1.3.0"},"debug":{"from":"debug@~0.7.2","version":"0.7.4"},"emitter-component":{"from":"emitter-component@1.0.0","version":"1.0.0"},"formidable":{"from":"formidable@1.0.14","version":"1.0.14"},"methods":{"from":"methods@0.0.1","version":"0.0.1"},"mime":{"from":"mime@1.2.5","version":"1.2.5"},"qs":{"from":"qs@0.6.5","version":"0.6.5"},"reduce-component":{"from":"reduce-component@1.0.1","version":"1.0.1"}},"from":"superagent@~0.15.7","version":"0.15.7"},"superagent-proxy":{"dependencies":{"proxy-agent":{"dependencies":{"http-proxy-agent":{"dependencies":{"agent-base":{"from":"agent-base@~1.0.1","version":"1.0.1"},"debug":{"from":"debug@~0.7.2","version":"0.7.4"},"extend":{"from":"extend@~1.2.0","version":"1.2.1"}},"from":"http-proxy-agent@0","version":"0.2.4"},"https-proxy-agent":{"dependencies":{"agent-base":{"from":"agent-base@~1.0.1","version":"1.0.1"},"debug":{"from":"debug@~0.7.2","version":"0.7.4"},"extend":{"from":"extend@~1.2.0","version":"1.2.1"}},"from":"https-proxy-agent@0","version":"0.3.3"},"lru-cache":{"from":"lru-cache@~2.3.1","version":"2.3.1"},"socks-proxy-agent":{"dependencies":{"agent-base":{"from":"agent-base@~1.0.1","version":"1.0.1"},"extend":{"from":"extend@~1.2.0","version":"1.2.1"},"rainbowsocks":{"dependencies":{"debug":{"from":"debug@~0.7.2","version":"0.7.4"}},"from":"rainbowsocks@~0.1.0","version":"0.1.1"}},"from":"socks-proxy-agent@0","version":"0.1.0"}},"from":"proxy-agent@~0.0.2","version":"0.0.2"}},"from":"superagent-proxy@~0.2.0","version":"0.2.0"}},"from":"w3cjs@~0.1.22","version":"0.1.24"}},"from":"grunt-html-validation@~0.1.13","version":"0.1.13"},"grunt-jekyll":{"dependencies":{"tmp":{"from":"tmp@0.0.21","version":"0.0.21"}},"from":"grunt-jekyll@~0.4.1","version":"0.4.1"},"grunt-jscs-checker":{"dependencies":{"hooker":{"from":"hooker@0.2.3","version":"0.2.3"},"jscs":{"dependencies":{"colors":{"from":"colors@0.6.0-1","resolved":"https://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz","version":"0.6.0-1"},"commander":{"dependencies":{"keypress":{"from":"keypress@0.1.x","version":"0.1.0"}},"from":"commander@1.2.0","version":"1.2.0"},"esprima":{"from":"esprima@1.0.3","version":"1.0.3"},"glob":{"dependencies":{"inherits":{"from":"inherits@2","version":"2.0.1"}},"from":"glob@3.2.7","version":"3.2.7"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@0.2.12","version":"0.2.12"},"vow":{"from":"vow@0.3.9","version":"0.3.9"},"vow-fs":{"dependencies":{"node-uuid":{"from":"node-uuid@1.4.0","version":"1.4.0"},"vow-queue":{"from":"vow-queue@0.0.2","version":"0.0.2"}},"from":"vow-fs@0.2.3","version":"0.2.3"},"xmlbuilder":{"dependencies":{"underscore":{"from":"underscore@>=1.5.x","version":"1.6.0"}},"from":"xmlbuilder@1.1.2","version":"1.1.2"}},"from":"jscs@~1.2.0","version":"1.2.4"},"lodash.assign":{"dependencies":{"lodash._basecreatecallback":{"dependencies":{"lodash._setbinddata":{"dependencies":{"lodash._isnative":{"from":"lodash._isnative@~2.4.1","version":"2.4.1"},"lodash.noop":{"from":"lodash.noop@~2.4.1","version":"2.4.1"}},"from":"lodash._setbinddata@~2.4.1","version":"2.4.1"},"lodash.bind":{"dependencies":{"lodash._createwrapper":{"dependencies":{"lodash._basebind":{"dependencies":{"lodash._basecreate":{"dependencies":{"lodash._isnative":{"from":"lodash._isnative@~2.4.1","version":"2.4.1"},"lodash.noop":{"from":"lodash.noop@~2.4.1","version":"2.4.1"}},"from":"lodash._basecreate@~2.4.1","version":"2.4.1"},"lodash.isobject":{"from":"lodash.isobject@~2.4.1","version":"2.4.1"}},"from":"lodash._basebind@~2.4.1","version":"2.4.1"},"lodash._basecreatewrapper":{"dependencies":{"lodash._basecreate":{"dependencies":{"lodash._isnative":{"from":"lodash._isnative@~2.4.1","version":"2.4.1"},"lodash.noop":{"from":"lodash.noop@~2.4.1","version":"2.4.1"}},"from":"lodash._basecreate@~2.4.1","version":"2.4.1"},"lodash.isobject":{"from":"lodash.isobject@~2.4.1","version":"2.4.1"}},"from":"lodash._basecreatewrapper@~2.4.1","version":"2.4.1"},"lodash.isfunction":{"from":"lodash.isfunction@~2.4.1","version":"2.4.1"}},"from":"lodash._createwrapper@~2.4.1","version":"2.4.1"},"lodash._slice":{"from":"lodash._slice@~2.4.1","version":"2.4.1"}},"from":"lodash.bind@~2.4.1","version":"2.4.1"},"lodash.identity":{"from":"lodash.identity@~2.4.1","version":"2.4.1"},"lodash.support":{"dependencies":{"lodash._isnative":{"from":"lodash._isnative@~2.4.1","version":"2.4.1"}},"from":"lodash.support@~2.4.1","version":"2.4.1"}},"from":"lodash._basecreatecallback@~2.4.1","version":"2.4.1"},"lodash._objecttypes":{"from":"lodash._objecttypes@~2.4.1","version":"2.4.1"},"lodash.keys":{"dependencies":{"lodash._isnative":{"from":"lodash._isnative@~2.4.1","version":"2.4.1"},"lodash._shimkeys":{"from":"lodash._shimkeys@~2.4.1","version":"2.4.1"},"lodash.isobject":{"from":"lodash.isobject@~2.4.1","version":"2.4.1"}},"from":"lodash.keys@~2.4.1","version":"2.4.1"}},"from":"lodash.assign@2.4.1","version":"2.4.1"},"vow":{"from":"vow@0.4.0","version":"0.4.0"}},"from":"grunt-jscs-checker@~0.3.0","version":"0.3.2"},"grunt-saucelabs":{"dependencies":{"colors":{"from":"colors@~0.6.2","version":"0.6.2"},"lodash":{"from":"lodash@~2.4.1","version":"2.4.1"},"q":{"from":"q@~1.0.0","version":"1.0.0"},"request":{"dependencies":{"aws-sign2":{"from":"aws-sign2@~0.5.0","version":"0.5.0"},"forever-agent":{"from":"forever-agent@~0.5.0","version":"0.5.2"},"form-data":{"dependencies":{"async":{"from":"async@~0.2.9","version":"0.2.10"},"combined-stream":{"dependencies":{"delayed-stream":{"from":"delayed-stream@0.0.5","version":"0.0.5"}},"from":"combined-stream@~0.0.4","version":"0.0.4"}},"from":"form-data@~0.1.0","version":"0.1.2"},"hawk":{"dependencies":{"boom":{"from":"boom@0.4.x","version":"0.4.2"},"cryptiles":{"from":"cryptiles@0.2.x","version":"0.2.2"},"hoek":{"from":"hoek@0.9.x","version":"0.9.1"},"sntp":{"from":"sntp@0.2.x","version":"0.2.4"}},"from":"hawk@~1.0.0","version":"1.0.0"},"http-signature":{"dependencies":{"asn1":{"from":"asn1@0.1.11","version":"0.1.11"},"assert-plus":{"from":"assert-plus@0.1.2","version":"0.1.2"},"ctype":{"from":"ctype@0.5.2","version":"0.5.2"}},"from":"http-signature@~0.10.0","version":"0.10.0"},"json-stringify-safe":{"from":"json-stringify-safe@~5.0.0","version":"5.0.0"},"mime":{"from":"mime@~1.2.9","version":"1.2.11"},"node-uuid":{"from":"node-uuid@~1.4.0","version":"1.4.1"},"oauth-sign":{"from":"oauth-sign@~0.3.0","version":"0.3.0"},"qs":{"from":"qs@~0.6.0","version":"0.6.6"},"tough-cookie":{"dependencies":{"punycode":{"from":"punycode@>=0.2.0","version":"1.2.3"}},"from":"tough-cookie@>=0.12.0","version":"0.12.1"},"tunnel-agent":{"from":"tunnel-agent@~0.3.0","version":"0.3.0"}},"from":"request@~2.33.0","version":"2.33.0"},"sauce-tunnel":{"dependencies":{"request":{"dependencies":{"aws-sign":{"from":"aws-sign@~0.3.0","version":"0.3.0"},"cookie-jar":{"from":"cookie-jar@~0.3.0","version":"0.3.0"},"forever-agent":{"from":"forever-agent@~0.5.0","version":"0.5.2"},"form-data":{"dependencies":{"async":{"from":"async@~0.2.7","version":"0.2.10"},"combined-stream":{"dependencies":{"delayed-stream":{"from":"delayed-stream@0.0.5","version":"0.0.5"}},"from":"combined-stream@~0.0.4","version":"0.0.4"}},"from":"form-data@0.0.8","version":"0.0.8"},"hawk":{"dependencies":{"boom":{"dependencies":{"hoek":{"from":"hoek@0.9.x","version":"0.9.1"}},"from":"boom@0.4.x","version":"0.4.2"},"cryptiles":{"from":"cryptiles@0.2.x","version":"0.2.2"},"hoek":{"from":"hoek@0.8.x","version":"0.8.5"},"sntp":{"dependencies":{"hoek":{"from":"hoek@0.9.x","version":"0.9.1"}},"from":"sntp@0.2.x","version":"0.2.4"}},"from":"hawk@~0.13.0","version":"0.13.1"},"http-signature":{"dependencies":{"asn1":{"from":"asn1@0.1.11","version":"0.1.11"},"assert-plus":{"from":"assert-plus@0.1.2","version":"0.1.2"},"ctype":{"from":"ctype@0.5.2","version":"0.5.2"}},"from":"http-signature@~0.9.11","version":"0.9.11"},"json-stringify-safe":{"from":"json-stringify-safe@~4.0.0","version":"4.0.0"},"mime":{"from":"mime@~1.2.9","version":"1.2.11"},"node-uuid":{"from":"node-uuid@~1.4.0","version":"1.4.1"},"oauth-sign":{"from":"oauth-sign@~0.3.0","version":"0.3.0"},"qs":{"from":"qs@~0.6.0","version":"0.6.6"},"tunnel-agent":{"from":"tunnel-agent@~0.3.0","version":"0.3.0"}},"from":"request@~2.21.0","version":"2.21.0"}},"from":"sauce-tunnel@~1.1.1","version":"1.1.2"},"saucelabs":{"from":"saucelabs@~0.1.1","version":"0.1.1"}},"from":"grunt-saucelabs@~5.0.0","version":"5.0.1"},"grunt-sed":{"dependencies":{"replace":{"dependencies":{"colors":{"from":"colors@0.5.x","version":"0.5.1"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@~0.2.9","version":"0.2.14"},"nomnom":{"dependencies":{"underscore":{"from":"underscore@~1.4.4","version":"1.4.4"}},"from":"nomnom@1.6.x","version":"1.6.2"}},"from":"replace@~0.2.4","version":"0.2.9"}},"from":"grunt-sed@~0.1.1","version":"0.1.1"},"load-grunt-tasks":{"dependencies":{"findup-sync":{"dependencies":{"glob":{"dependencies":{"graceful-fs":{"from":"graceful-fs@~1.2.0","version":"1.2.3"},"inherits":{"from":"inherits@1","version":"1.0.0"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@~0.2.11","version":"0.2.14"}},"from":"glob@~3.1.21","version":"3.1.21"},"lodash":{"from":"lodash@~1.0.1","version":"1.0.1"}},"from":"findup-sync@~0.1.2","version":"0.1.2"},"globule":{"dependencies":{"glob":{"dependencies":{"inherits":{"from":"inherits@2","version":"2.0.1"}},"from":"glob@~3.2.7","version":"3.2.8"},"lodash":{"from":"lodash@~2.4.1","version":"2.4.1"},"minimatch":{"dependencies":{"lru-cache":{"from":"lru-cache@2","version":"2.5.0"},"sigmund":{"from":"sigmund@~1.0.0","version":"1.0.0"}},"from":"minimatch@~0.2.9","version":"0.2.14"}},"from":"globule@~0.2.0","version":"0.2.0"}},"from":"load-grunt-tasks@~0.3.0","version":"0.3.0"},"markdown":{"dependencies":{"nopt":{"dependencies":{"abbrev":{"from":"abbrev@1","version":"1.0.4"}},"from":"nopt@~2.1.1","version":"2.1.2"}},"from":"markdown@~0.5.0","version":"0.5.0"}},"name":"bootstrap","version":"3.1.1"}
|
@@ -0,0 +1 @@
|
|
1
|
+
boto==2.20.0
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#!/usr/bin/env python2.7
|
2
|
+
from __future__ import absolute_import, unicode_literals, print_function, division
|
3
|
+
|
4
|
+
from sys import argv
|
5
|
+
from os import environ, stat, remove as _delete_file
|
6
|
+
from os.path import isfile, dirname, basename, abspath
|
7
|
+
from hashlib import sha256
|
8
|
+
from subprocess import check_call as run
|
9
|
+
|
10
|
+
from boto.s3.connection import S3Connection
|
11
|
+
from boto.s3.key import Key
|
12
|
+
from boto.exception import S3ResponseError
|
13
|
+
|
14
|
+
|
15
|
+
NEED_TO_UPLOAD_MARKER = '.need-to-upload'
|
16
|
+
BYTES_PER_MB = 1024 * 1024
|
17
|
+
try:
|
18
|
+
BUCKET_NAME = environ['TWBS_S3_BUCKET']
|
19
|
+
except KeyError:
|
20
|
+
raise SystemExit("TWBS_S3_BUCKET environment variable not set!")
|
21
|
+
|
22
|
+
|
23
|
+
def _sha256_of_file(filename):
|
24
|
+
hasher = sha256()
|
25
|
+
with open(filename, 'rb') as input_file:
|
26
|
+
hasher.update(input_file.read())
|
27
|
+
file_hash = hasher.hexdigest()
|
28
|
+
print('sha256({}) = {}'.format(filename, file_hash))
|
29
|
+
return file_hash
|
30
|
+
|
31
|
+
|
32
|
+
def _delete_file_quietly(filename):
|
33
|
+
try:
|
34
|
+
_delete_file(filename)
|
35
|
+
except (OSError, IOError):
|
36
|
+
pass
|
37
|
+
|
38
|
+
|
39
|
+
def _tarball_size(directory):
|
40
|
+
kib = stat(_tarball_filename_for(directory)).st_size // BYTES_PER_MB
|
41
|
+
return "{} MiB".format(kib)
|
42
|
+
|
43
|
+
|
44
|
+
def _tarball_filename_for(directory):
|
45
|
+
return abspath('./{}.tar.gz'.format(basename(directory)))
|
46
|
+
|
47
|
+
|
48
|
+
def _create_tarball(directory):
|
49
|
+
print("Creating tarball of {}...".format(directory))
|
50
|
+
run(['tar', '-czf', _tarball_filename_for(directory), '-C', dirname(directory), basename(directory)])
|
51
|
+
|
52
|
+
|
53
|
+
def _extract_tarball(directory):
|
54
|
+
print("Extracting tarball of {}...".format(directory))
|
55
|
+
run(['tar', '-xzf', _tarball_filename_for(directory), '-C', dirname(directory)])
|
56
|
+
|
57
|
+
|
58
|
+
def download(directory):
|
59
|
+
_delete_file_quietly(NEED_TO_UPLOAD_MARKER)
|
60
|
+
try:
|
61
|
+
print("Downloading {} tarball from S3...".format(friendly_name))
|
62
|
+
key.get_contents_to_filename(_tarball_filename_for(directory))
|
63
|
+
except S3ResponseError as err:
|
64
|
+
open(NEED_TO_UPLOAD_MARKER, 'a').close()
|
65
|
+
print(err)
|
66
|
+
raise SystemExit("Cached {} download failed!".format(friendly_name))
|
67
|
+
print("Downloaded {}.".format(_tarball_size(directory)))
|
68
|
+
_extract_tarball(directory)
|
69
|
+
print("{} successfully installed from cache.".format(friendly_name))
|
70
|
+
|
71
|
+
|
72
|
+
def upload(directory):
|
73
|
+
_create_tarball(directory)
|
74
|
+
print("Uploading {} tarball to S3... ({})".format(friendly_name, _tarball_size(directory)))
|
75
|
+
key.set_contents_from_filename(_tarball_filename_for(directory))
|
76
|
+
print("{} cache successfully updated.".format(friendly_name))
|
77
|
+
_delete_file_quietly(NEED_TO_UPLOAD_MARKER)
|
78
|
+
|
79
|
+
|
80
|
+
if __name__ == '__main__':
|
81
|
+
# Uses environment variables:
|
82
|
+
# AWS_ACCESS_KEY_ID -- AWS Access Key ID
|
83
|
+
# AWS_SECRET_ACCESS_KEY -- AWS Secret Access Key
|
84
|
+
argv.pop(0)
|
85
|
+
if len(argv) != 4:
|
86
|
+
raise SystemExit("USAGE: s3_cache.py <download | upload> <friendly name> <dependencies file> <directory>")
|
87
|
+
mode, friendly_name, dependencies_file, directory = argv
|
88
|
+
|
89
|
+
conn = S3Connection()
|
90
|
+
bucket = conn.lookup(BUCKET_NAME, validate=False)
|
91
|
+
if bucket is None:
|
92
|
+
raise SystemExit("Could not access bucket!")
|
93
|
+
|
94
|
+
dependencies_file_hash = _sha256_of_file(dependencies_file)
|
95
|
+
|
96
|
+
key = Key(bucket, dependencies_file_hash)
|
97
|
+
key.storage_class = 'REDUCED_REDUNDANCY'
|
98
|
+
|
99
|
+
if mode == 'download':
|
100
|
+
download(directory)
|
101
|
+
elif mode == 'upload':
|
102
|
+
if isfile(NEED_TO_UPLOAD_MARKER): # FIXME
|
103
|
+
upload(directory)
|
104
|
+
else:
|
105
|
+
print("No need to upload anything.")
|
106
|
+
else:
|
107
|
+
raise SystemExit("Unrecognized mode {!r}".format(mode))
|
@@ -0,0 +1,83 @@
|
|
1
|
+
[
|
2
|
+
# Docs: https://saucelabs.com/docs/platforms/webdriver
|
3
|
+
|
4
|
+
{
|
5
|
+
browserName: "safari",
|
6
|
+
platform: "OS X 10.9"
|
7
|
+
},
|
8
|
+
# {
|
9
|
+
# browserName: "googlechrome",
|
10
|
+
# platform: "OS X 10.9",
|
11
|
+
# version: "31"
|
12
|
+
# },
|
13
|
+
{
|
14
|
+
browserName: "firefox",
|
15
|
+
platform: "OS X 10.9"
|
16
|
+
},
|
17
|
+
|
18
|
+
# Mac Opera not currently supported by Sauce Labs
|
19
|
+
|
20
|
+
{
|
21
|
+
browserName: "internet explorer",
|
22
|
+
version: "11",
|
23
|
+
platform: "Windows 8.1"
|
24
|
+
},
|
25
|
+
{
|
26
|
+
browserName: "internet explorer",
|
27
|
+
version: "10",
|
28
|
+
platform: "Windows 8"
|
29
|
+
},
|
30
|
+
# {
|
31
|
+
# browserName: "internet explorer",
|
32
|
+
# version: "9",
|
33
|
+
# platform: "Windows 7"
|
34
|
+
# },
|
35
|
+
# {
|
36
|
+
# browserName: "internet explorer",
|
37
|
+
# version: "8",
|
38
|
+
# platform: "Windows 7"
|
39
|
+
# },
|
40
|
+
|
41
|
+
# { # Unofficial
|
42
|
+
# browserName: "internet explorer",
|
43
|
+
# version: "7",
|
44
|
+
# platform: "Windows XP"
|
45
|
+
# },
|
46
|
+
|
47
|
+
{
|
48
|
+
browserName: "googlechrome",
|
49
|
+
platform: "Windows 8.1"
|
50
|
+
},
|
51
|
+
{
|
52
|
+
browserName: "firefox",
|
53
|
+
platform: "Windows 8.1"
|
54
|
+
},
|
55
|
+
|
56
|
+
# Win Opera 15+ not currently supported by Sauce Labs
|
57
|
+
|
58
|
+
{
|
59
|
+
browserName: "iphone",
|
60
|
+
platform: "OS X 10.9",
|
61
|
+
version: "7"
|
62
|
+
},
|
63
|
+
|
64
|
+
# iOS Chrome not currently supported by Sauce Labs
|
65
|
+
|
66
|
+
# Linux (unofficial)
|
67
|
+
{
|
68
|
+
browserName: "googlechrome",
|
69
|
+
platform: "Linux"
|
70
|
+
},
|
71
|
+
{
|
72
|
+
browserName: "firefox",
|
73
|
+
platform: "Linux"
|
74
|
+
}
|
75
|
+
|
76
|
+
# Android Chrome not currently supported by Sauce Labs
|
77
|
+
|
78
|
+
# { # Android Browser (super-unofficial)
|
79
|
+
# browserName: "android",
|
80
|
+
# version: "4.0",
|
81
|
+
# platform: "Linux"
|
82
|
+
# }
|
83
|
+
]
|
@@ -1,24 +1,23 @@
|
|
1
1
|
{
|
2
2
|
"name": "html5shiv",
|
3
|
-
"version": "3.7.
|
3
|
+
"version": "3.7.1",
|
4
4
|
"main": [
|
5
|
-
"dist/html5shiv.js"
|
6
|
-
"dist/html5shiv-printshiv.js"
|
5
|
+
"dist/html5shiv.js"
|
7
6
|
],
|
8
7
|
"ignore": [
|
9
8
|
"**/.*",
|
10
|
-
"
|
9
|
+
"composer.json",
|
11
10
|
"test",
|
12
11
|
"build",
|
13
12
|
"src",
|
14
13
|
"build.xml"
|
15
14
|
],
|
16
15
|
"homepage": "https://github.com/aFarkas/html5shiv",
|
17
|
-
"_release": "3.7.
|
16
|
+
"_release": "3.7.1",
|
18
17
|
"_resolution": {
|
19
18
|
"type": "version",
|
20
|
-
"tag": "3.7.
|
21
|
-
"commit": "
|
19
|
+
"tag": "3.7.1",
|
20
|
+
"commit": "eb0bd4173238ba59da4dfa43090008bd18d3bd64"
|
22
21
|
},
|
23
22
|
"_source": "git://github.com/aFarkas/html5shiv.git",
|
24
23
|
"_target": "~3.7.0",
|
@@ -0,0 +1,61 @@
|
|
1
|
+
/*global module:false*/
|
2
|
+
module.exports = function(grunt){
|
3
|
+
|
4
|
+
|
5
|
+
// Project configuration.
|
6
|
+
grunt.initConfig({
|
7
|
+
pkg: grunt.file.readJSON('package.json'),
|
8
|
+
bower: grunt.file.readJSON('bower.json'),
|
9
|
+
copy: {
|
10
|
+
demo: {
|
11
|
+
files: [
|
12
|
+
{expand: true, src: ['src/*'], dest: 'dist/', filter: 'isFile', flatten: true}
|
13
|
+
]
|
14
|
+
}
|
15
|
+
},
|
16
|
+
|
17
|
+
uglify: {
|
18
|
+
options: {
|
19
|
+
beautify: {
|
20
|
+
ascii_only : true
|
21
|
+
},
|
22
|
+
preserveComments: 'some'
|
23
|
+
},
|
24
|
+
html5shiv: {
|
25
|
+
files: [{
|
26
|
+
expand: true, // Enable dynamic expansion.
|
27
|
+
cwd: 'src/', // Src matches are relative to this path.
|
28
|
+
src: ['**/*.js'], // Actual pattern(s) to match.
|
29
|
+
dest: 'dist/', // Destination path prefix.
|
30
|
+
ext: '.min.js'
|
31
|
+
}]
|
32
|
+
}
|
33
|
+
},
|
34
|
+
watch: {
|
35
|
+
js: {
|
36
|
+
files: ['src/**/*.js'],
|
37
|
+
tasks: ['copy', 'uglify', 'bytesize']
|
38
|
+
}
|
39
|
+
},
|
40
|
+
bytesize: {
|
41
|
+
all: {
|
42
|
+
src: [
|
43
|
+
'dist/**.min.js'
|
44
|
+
]
|
45
|
+
}
|
46
|
+
}
|
47
|
+
});
|
48
|
+
|
49
|
+
|
50
|
+
// Default task.
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
grunt.loadNpmTasks('grunt-contrib-copy');
|
55
|
+
grunt.loadNpmTasks('grunt-contrib-uglify');
|
56
|
+
grunt.loadNpmTasks('grunt-contrib-watch');
|
57
|
+
grunt.loadNpmTasks('grunt-bytesize');
|
58
|
+
|
59
|
+
grunt.registerTask('default', ['copy', 'uglify', 'bytesize', 'watch']);
|
60
|
+
|
61
|
+
};
|