From 0912fbd76e40584dd1a6c8875d6c247f1f40a486 Mon Sep 17 00:00:00 2001 From: Scott Hillman Date: Thu, 30 Aug 2012 15:39:01 -0600 Subject: [PATCH 1/7] Added urlOnly option to streetview --- lib/googlemaps.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/googlemaps.js b/lib/googlemaps.js index 84a531c..789d3e4 100644 --- a/lib/googlemaps.js +++ b/lib/googlemaps.js @@ -297,7 +297,7 @@ exports.staticMap = function(center, zoom, size, callback, sensor , // http://code.google.com/apis/maps/documentation/streetview exports.streetView = function(size, location, callback, sensor, - heading, fov, pitch) { + heading, fov, pitch, urlOnly) { var args = { 'size': size, 'location': location @@ -324,7 +324,12 @@ exports.streetView = function(size, location, callback, sensor, args.sensor = sensor || 'false'; var path = '/maps/api/streetview'; - return makeRequest(path, args, false, callback, 'binary'); + if (urlOnly) { + return 'http://maps.googleapis.com' + buildUrl(path, args) + } + else { + return makeRequest(path, args, false, callback, 'binary'); + } }; // Helper function to check and convert an array of points, be it strings/numbers/etc From 7e42e7e8d4d41ef9562b2c988cb8c2a9203c2038 Mon Sep 17 00:00:00 2001 From: Chase Brammer Date: Thu, 18 Oct 2012 16:14:30 -0600 Subject: [PATCH 2/7] updating npm --- .gitignore | 61 ++ node_modules/.bin/vows | 1 + node_modules/request/LICENSE | 55 ++ node_modules/request/README.md | 285 ++++++++ node_modules/request/main.js | 618 +++++++++++++++++ node_modules/request/mimetypes.js | 146 ++++ node_modules/request/oauth.js | 34 + node_modules/request/package.json | 32 + node_modules/request/tests/googledoodle.png | Bin 0 -> 38510 bytes node_modules/request/tests/run.sh | 6 + node_modules/request/tests/server.js | 57 ++ node_modules/request/tests/test-body.js | 90 +++ node_modules/request/tests/test-cookie.js | 29 + node_modules/request/tests/test-cookiejar.js | 90 +++ node_modules/request/tests/test-errors.js | 30 + node_modules/request/tests/test-oauth.js | 109 +++ node_modules/request/tests/test-pipes.js | 167 +++++ node_modules/request/tests/test-proxy.js | 39 ++ node_modules/request/tests/test-timeout.js | 87 +++ node_modules/request/uuid.js | 19 + node_modules/request/vendor/cookie/index.js | 55 ++ node_modules/request/vendor/cookie/jar.js | 72 ++ node_modules/vows/.npmignore | 1 + node_modules/vows/.travis.yml | 6 + node_modules/vows/LICENSE | 20 + node_modules/vows/Makefile | 7 + node_modules/vows/README.md | 65 ++ node_modules/vows/bin/vows | 579 ++++++++++++++++ node_modules/vows/lib/assert/error.js | 152 +++++ node_modules/vows/lib/assert/macros.js | 222 +++++++ node_modules/vows/lib/assert/utils.js | 77 +++ node_modules/vows/lib/vows.js | 256 +++++++ node_modules/vows/lib/vows/console.js | 140 ++++ node_modules/vows/lib/vows/context.js | 76 +++ node_modules/vows/lib/vows/coverage/file.js | 29 + .../coverage/fragments/coverage-foot.html | 3 + .../coverage/fragments/coverage-head.html | 300 +++++++++ .../vows/lib/vows/coverage/report-html.js | 133 ++++ .../vows/lib/vows/coverage/report-json.js | 54 ++ .../vows/lib/vows/coverage/report-plain.js | 38 ++ .../vows/lib/vows/coverage/report-xml.js | 81 +++ node_modules/vows/lib/vows/extras.js | 28 + .../vows/lib/vows/reporters/dot-matrix.js | 67 ++ node_modules/vows/lib/vows/reporters/json.js | 33 + .../vows/lib/vows/reporters/silent.js | 8 + node_modules/vows/lib/vows/reporters/spec.js | 42 ++ node_modules/vows/lib/vows/reporters/tap.js | 100 +++ node_modules/vows/lib/vows/reporters/watch.js | 37 ++ node_modules/vows/lib/vows/reporters/xunit.js | 90 +++ node_modules/vows/lib/vows/suite.js | 386 +++++++++++ node_modules/vows/node_modules/diff/LICENSE | 31 + node_modules/vows/node_modules/diff/README.md | 94 +++ node_modules/vows/node_modules/diff/diff.js | 296 +++++++++ .../vows/node_modules/diff/index.html | 89 +++ .../vows/node_modules/diff/package.json | 42 ++ node_modules/vows/node_modules/diff/style.css | 81 +++ .../vows/node_modules/diff/test/diffTest.js | 625 ++++++++++++++++++ node_modules/vows/node_modules/eyes/LICENSE | 20 + node_modules/vows/node_modules/eyes/Makefile | 4 + node_modules/vows/node_modules/eyes/README.md | 73 ++ .../vows/node_modules/eyes/lib/eyes.js | 236 +++++++ .../vows/node_modules/eyes/package.json | 39 ++ .../vows/node_modules/eyes/test/eyes-test.js | 56 ++ node_modules/vows/package.json | 40 ++ node_modules/vows/test/VowsCamelCaseTest.js | 14 + node_modules/vows/test/assert-test.js | 137 ++++ .../vows/test/fixtures/isolate/failing.js | 18 + .../vows/test/fixtures/isolate/log.js | 18 + .../vows/test/fixtures/isolate/passing.js | 17 + .../vows/test/fixtures/isolate/stderr.js | 18 + .../test/fixtures/supress-stdout/output.js | 16 + node_modules/vows/test/isolate-test.js | 140 ++++ node_modules/vows/test/supress-stdout-test.js | 43 ++ node_modules/vows/test/vows-error-test.js | 51 ++ node_modules/vows/test/vows-test.js | 522 +++++++++++++++ .../vows/test/vows_underscore_test.js | 14 + node_modules/waitress/README.md | 38 ++ node_modules/waitress/index.js | 36 + node_modules/waitress/package.json | 26 + node_modules/waitress/test.js | 63 ++ 80 files changed, 8009 insertions(+) create mode 100644 .gitignore create mode 120000 node_modules/.bin/vows create mode 100644 node_modules/request/LICENSE create mode 100644 node_modules/request/README.md create mode 100644 node_modules/request/main.js create mode 100644 node_modules/request/mimetypes.js create mode 100644 node_modules/request/oauth.js create mode 100644 node_modules/request/package.json create mode 100644 node_modules/request/tests/googledoodle.png create mode 100755 node_modules/request/tests/run.sh create mode 100644 node_modules/request/tests/server.js create mode 100644 node_modules/request/tests/test-body.js create mode 100644 node_modules/request/tests/test-cookie.js create mode 100644 node_modules/request/tests/test-cookiejar.js create mode 100644 node_modules/request/tests/test-errors.js create mode 100644 node_modules/request/tests/test-oauth.js create mode 100644 node_modules/request/tests/test-pipes.js create mode 100644 node_modules/request/tests/test-proxy.js create mode 100644 node_modules/request/tests/test-timeout.js create mode 100644 node_modules/request/uuid.js create mode 100644 node_modules/request/vendor/cookie/index.js create mode 100644 node_modules/request/vendor/cookie/jar.js create mode 100644 node_modules/vows/.npmignore create mode 100644 node_modules/vows/.travis.yml create mode 100644 node_modules/vows/LICENSE create mode 100644 node_modules/vows/Makefile create mode 100644 node_modules/vows/README.md create mode 100755 node_modules/vows/bin/vows create mode 100644 node_modules/vows/lib/assert/error.js create mode 100644 node_modules/vows/lib/assert/macros.js create mode 100644 node_modules/vows/lib/assert/utils.js create mode 100644 node_modules/vows/lib/vows.js create mode 100644 node_modules/vows/lib/vows/console.js create mode 100644 node_modules/vows/lib/vows/context.js create mode 100644 node_modules/vows/lib/vows/coverage/file.js create mode 100644 node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html create mode 100644 node_modules/vows/lib/vows/coverage/fragments/coverage-head.html create mode 100644 node_modules/vows/lib/vows/coverage/report-html.js create mode 100644 node_modules/vows/lib/vows/coverage/report-json.js create mode 100644 node_modules/vows/lib/vows/coverage/report-plain.js create mode 100644 node_modules/vows/lib/vows/coverage/report-xml.js create mode 100644 node_modules/vows/lib/vows/extras.js create mode 100644 node_modules/vows/lib/vows/reporters/dot-matrix.js create mode 100644 node_modules/vows/lib/vows/reporters/json.js create mode 100644 node_modules/vows/lib/vows/reporters/silent.js create mode 100644 node_modules/vows/lib/vows/reporters/spec.js create mode 100644 node_modules/vows/lib/vows/reporters/tap.js create mode 100644 node_modules/vows/lib/vows/reporters/watch.js create mode 100644 node_modules/vows/lib/vows/reporters/xunit.js create mode 100644 node_modules/vows/lib/vows/suite.js create mode 100644 node_modules/vows/node_modules/diff/LICENSE create mode 100644 node_modules/vows/node_modules/diff/README.md create mode 100644 node_modules/vows/node_modules/diff/diff.js create mode 100644 node_modules/vows/node_modules/diff/index.html create mode 100644 node_modules/vows/node_modules/diff/package.json create mode 100644 node_modules/vows/node_modules/diff/style.css create mode 100644 node_modules/vows/node_modules/diff/test/diffTest.js create mode 100644 node_modules/vows/node_modules/eyes/LICENSE create mode 100644 node_modules/vows/node_modules/eyes/Makefile create mode 100644 node_modules/vows/node_modules/eyes/README.md create mode 100644 node_modules/vows/node_modules/eyes/lib/eyes.js create mode 100644 node_modules/vows/node_modules/eyes/package.json create mode 100644 node_modules/vows/node_modules/eyes/test/eyes-test.js create mode 100644 node_modules/vows/package.json create mode 100644 node_modules/vows/test/VowsCamelCaseTest.js create mode 100644 node_modules/vows/test/assert-test.js create mode 100644 node_modules/vows/test/fixtures/isolate/failing.js create mode 100644 node_modules/vows/test/fixtures/isolate/log.js create mode 100644 node_modules/vows/test/fixtures/isolate/passing.js create mode 100644 node_modules/vows/test/fixtures/isolate/stderr.js create mode 100644 node_modules/vows/test/fixtures/supress-stdout/output.js create mode 100644 node_modules/vows/test/isolate-test.js create mode 100644 node_modules/vows/test/supress-stdout-test.js create mode 100644 node_modules/vows/test/vows-error-test.js create mode 100644 node_modules/vows/test/vows-test.js create mode 100644 node_modules/vows/test/vows_underscore_test.js create mode 100644 node_modules/waitress/README.md create mode 100644 node_modules/waitress/index.js create mode 100644 node_modules/waitress/package.json create mode 100644 node_modules/waitress/test.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b47def --- /dev/null +++ b/.gitignore @@ -0,0 +1,61 @@ +lib-cov +*.seed +*.log +*.node +*.wafpickle-7 +*.lock-wscript +*.csv +*.dat +*.out +*.pid +*.gz +*.swp +.DS_Store +dump.rdb +.jshintrc + +pids +logs +results + +/public/js/app.js +/public/css/style.css +npm-debug.log +/config/version.json +/config/local.json +/client/config.js +.build +/docs + + +/node_modules/googlemaps +/node_modules/baptize +/node_modules/boilerplate +/node_modules/challenges +/node_modules/calorie-calculator +/node_modules/equipment +/node_modules/interactions +/node_modules/log-workout +/node_modules/maps +/node_modules/user +/node_modules/tempest +/node_modules/admin +/node_modules/achievements +/node_modules/workout-manager +/node_modules/payment-api +/node_modules/media +/node_modules/action-pipeline +/node_modules/geolib +/node_modules/winston-pulse +/node_modules/paymentApi +/node_modules/legacy-api +/node_modules/log-biometric +/node_modules/gpx-parser +/node_modules/wpl2 +/node_modules/soap +/node_modules/sketch +/node_modules/oauth +/node_modules/ifit-mail +/node_modules/static-map +/node_modules/workout-translator + diff --git a/node_modules/.bin/vows b/node_modules/.bin/vows new file mode 120000 index 0000000..0386e59 --- /dev/null +++ b/node_modules/.bin/vows @@ -0,0 +1 @@ +../vows/bin/vows \ No newline at end of file diff --git a/node_modules/request/LICENSE b/node_modules/request/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/request/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/request/README.md b/node_modules/request/README.md new file mode 100644 index 0000000..c30f1a5 --- /dev/null +++ b/node_modules/request/README.md @@ -0,0 +1,285 @@ +# Request -- Simplified HTTP request method + +## Install + +
+  npm install request
+
+ +Or from source: + +
+  git clone git://github.com/mikeal/request.git 
+  cd request
+  npm link
+
+ +## Super simple to use + +Request is designed to be the simplest way possible to make http calls. It support HTTPS and follows redirects by default. + +```javascript +var request = require('request'); +request('http://www.google.com', function (error, response, body) { + if (!error && response.statusCode == 200) { + console.log(body) // Print the google web page. + } +}) +``` + +## Streaming + +You can stream any response to a file stream. + +```javascript +request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) +``` + +You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers. + +```javascript +fs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json')) +``` + +Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers. + +```javascript +request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) +``` + +Now let's get fancy. + +```javascript +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + if (req.method === 'PUT') { + req.pipe(request.put('http://mysite.com/doodle.png')) + } else if (req.method === 'GET' || req.method === 'HEAD') { + request.get('http://mysite.com/doodle.png').pipe(resp) + } + } +}) +``` + +You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do: + +```javascript +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + var x = request('http://mysite.com/doodle.png') + req.pipe(x) + x.pipe(resp) + } +}) +``` + +And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :) + +```javascript +req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) +``` + +Also, none of this new functionality conflicts with requests previous features, it just expands them. + +```javascript +var r = request.defaults({'proxy':'http://localproxy.com'}) + +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + r.get('http://google.com/doodle.png').pipe(resp) + } +}) +``` + +You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. + +## OAuth Signing + +```javascript +// Twitter OAuth +var qs = require('querystring') + , oauth = + { callback: 'http://mysite.com/callback/' + , consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + } + , url = 'https://api.twitter.com/oauth/request_token' + ; +request.post({url:url, oauth:oauth}, function (e, r, body) { + // Assume by some stretch of magic you aquired the verifier + var access_token = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: access_token.oauth_token + , verifier: VERIFIER + , token_secret: access_token.oauth_token_secret + } + , url = 'https://api.twitter.com/oauth/access_token' + ; + request.post({url:url, oauth:oauth}, function (e, r, body) { + var perm_token = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: perm_token.oauth_token + , token_secret: perm_token.oauth_token_secret + } + , url = 'https://api.twitter.com/1/users/show.json?' + , params = + { screen_name: perm_token.screen_name + , user_id: perm_token.user_id + } + ; + url += qs.stringify(params) + request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { + console.log(user) + }) + }) +}) +``` + + + +### request(options, callback) + +The first argument can be either a url or an options object. The only required option is uri, all others are optional. + +* `uri` || `url` - fully qualified uri or a parsed url object from url.parse() +* `method` - http method, defaults to GET +* `headers` - http headers, defaults to {} +* `body` - entity body for POST and PUT requests. Must be buffer or string. +* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. +* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. +* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true. +* `maxRedirects` - the maximum number of redirects to follow, defaults to 10. +* `onResponse` - If true the callback will be fired on the "response" event instead of "end". If a function it will be called on "response" and not effect the regular semantics of the main callback on "end". +* `encoding` - Encoding to be used on response.setEncoding when buffering the response data. +* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets. +* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. +* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request +* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri. +* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above. +* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option. +* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) + + +The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body buffer. + +## Convenience methods + +There are also shorthand methods for different HTTP METHODs and some other conveniences. + +### request.defaults(options) + +This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. + +### request.put + +Same as request() but defaults to `method: "PUT"`. + +```javascript +request.put(url) +``` + +### request.post + +Same as request() but defaults to `method: "POST"`. + +```javascript +request.post(url) +``` + +### request.head + +Same as request() but defaults to `method: "HEAD"`. + +```javascript +request.head(url) +``` + +### request.del + +Same as request() but defaults to `method: "DELETE"`. + +```javascript +request.del(url) +``` + +### request.get + +Alias to normal request method for uniformity. + +```javascript +request.get(url) +``` +### request.cookie + +Function that creates a new cookie. + +```javascript +request.cookie('cookie_string_here') +``` +### request.jar + +Function that creates a new cookie jar. + +```javascript +request.jar() +``` + + +## Examples: + +```javascript + var request = require('request') + , rand = Math.floor(Math.random()*100000000).toString() + ; + request( + { method: 'PUT' + , uri: 'http://mikeal.iriscouch.com/testjs/' + rand + , multipart: + [ { 'content-type': 'application/json' + , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + } + , { body: 'I am an attachment' } + ] + } + , function (error, response, body) { + if(response.statusCode == 201){ + console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) + } else { + console.log('error: '+ response.statusCode) + console.log(body) + } + } + ) +``` +Cookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent). + +```javascript +var request = request.defaults({jar: false}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option: + +```javascript +var j = request.jar() +var request = request.defaults({jar:j}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` +OR + +```javascript +var j = request.jar() +var cookie = request.cookie('your_cookie_here') +j.add(cookie) +request({url: 'http://www.google.com', jar: j}, function () { + request('http://images.google.com') +}) +``` diff --git a/node_modules/request/main.js b/node_modules/request/main.js new file mode 100644 index 0000000..7566d1e --- /dev/null +++ b/node_modules/request/main.js @@ -0,0 +1,618 @@ +// Copyright 2010-2011 Mikeal Rogers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +var http = require('http') + , https = false + , tls = false + , url = require('url') + , util = require('util') + , stream = require('stream') + , qs = require('querystring') + , mimetypes = require('./mimetypes') + , oauth = require('./oauth') + , uuid = require('./uuid') + , Cookie = require('./vendor/cookie') + , CookieJar = require('./vendor/cookie/jar') + , cookieJar = new CookieJar + ; + +try { + https = require('https') +} catch (e) {} + +try { + tls = require('tls') +} catch (e) {} + +function toBase64 (str) { + return (new Buffer(str || "", "ascii")).toString("base64") +} + +// Hacky fix for pre-0.4.4 https +if (https && !https.Agent) { + https.Agent = function (options) { + http.Agent.call(this, options) + } + util.inherits(https.Agent, http.Agent) + https.Agent.prototype._getConnection = function(host, port, cb) { + var s = tls.connect(port, host, this.options, function() { + // do other checks here? + if (cb) cb() + }) + return s + } +} + +function isReadStream (rs) { + if (rs.readable && rs.path && rs.mode) { + return true + } +} + +function copy (obj) { + var o = {} + for (var i in obj) o[i] = obj[i] + return o +} + +var isUrl = /^https?:/ + +var globalPool = {} + +function Request (options) { + stream.Stream.call(this) + this.readable = true + this.writable = true + + if (typeof options === 'string') { + options = {uri:options} + } + + for (var i in options) { + this[i] = options[i] + } + if (!this.pool) this.pool = globalPool + this.dests = [] + this.__isRequestRequest = true +} +util.inherits(Request, stream.Stream) +Request.prototype.getAgent = function (host, port) { + if (!this.pool[host+':'+port]) { + this.pool[host+':'+port] = new this.httpModule.Agent({host:host, port:port}) + } + return this.pool[host+':'+port] +} +Request.prototype.request = function () { + var self = this + + // Protect against double callback + if (!self._callback && self.callback) { + self._callback = self.callback + self.callback = function () { + if (self._callbackCalled) return // Print a warning maybe? + self._callback.apply(self, arguments) + self._callbackCalled = true + } + } + + if (self.url) { + // People use this property instead all the time so why not just support it. + self.uri = self.url + delete self.url + } + + if (!self.uri) { + throw new Error("options.uri is a required argument") + } else { + if (typeof self.uri == "string") self.uri = url.parse(self.uri) + } + if (self.proxy) { + if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) + } + + self._redirectsFollowed = self._redirectsFollowed || 0 + self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 + self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true + if (self.followRedirect) + self.redirects = self.redirects || [] + + self.headers = self.headers ? copy(self.headers) : {} + + var setHost = false + if (!self.headers.host) { + self.headers.host = self.uri.hostname + if (self.uri.port) { + if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && + !(self.uri.port === 443 && self.uri.protocol === 'https:') ) + self.headers.host += (':'+self.uri.port) + } + setHost = true + } + + if (self.jar === false) { + // disable cookies + var cookies = false; + self._disableCookies = true; + } else if (self.jar) { + // fetch cookie from the user defined cookie jar + var cookies = self.jar.get({ url: self.uri.href }) + } else { + // fetch cookie from the global cookie jar + var cookies = cookieJar.get({ url: self.uri.href }) + } + if (cookies) { + var cookieString = cookies.map(function (c) { + return c.name + "=" + c.value; + }).join("; "); + + self.headers.Cookie = cookieString; + } + + if (!self.uri.pathname) {self.uri.pathname = '/'} + if (!self.uri.port) { + if (self.uri.protocol == 'http:') {self.uri.port = 80} + else if (self.uri.protocol == 'https:') {self.uri.port = 443} + } + + if (self.proxy) { + self.port = self.proxy.port + self.host = self.proxy.hostname + } else { + self.port = self.uri.port + self.host = self.uri.hostname + } + + if (self.onResponse === true) { + self.onResponse = self.callback + delete self.callback + } + + var clientErrorHandler = function (error) { + if (setHost) delete self.headers.host + if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer) + self.emit('error', error) + } + if (self.onResponse) self.on('error', function (e) {self.onResponse(e)}) + if (self.callback) self.on('error', function (e) {self.callback(e)}) + + if (self.form) { + self.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8' + self.body = qs.stringify(self.form).toString('utf8') + } + + if (self.oauth) { + var form + if (self.headers['content-type'] && + self.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) === + 'application/x-www-form-urlencoded' + ) { + form = qs.parse(self.body) + } + if (self.uri.query) { + form = qs.parse(self.uri.query) + } + if (!form) form = {} + var oa = {} + for (var i in form) oa[i] = form[i] + for (var i in self.oauth) oa['oauth_'+i] = self.oauth[i] + if (!oa.oauth_version) oa.oauth_version = '1.0' + if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString() + if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') + + oa.oauth_signature_method = 'HMAC-SHA1' + + var consumer_secret = oa.oauth_consumer_secret + delete oa.oauth_consumer_secret + var token_secret = oa.oauth_token_secret + delete oa.oauth_token_secret + + var baseurl = self.uri.protocol + '//' + self.uri.host + self.uri.pathname + var signature = oauth.hmacsign(self.method, baseurl, oa, consumer_secret, token_secret) + + // oa.oauth_signature = signature + for (var i in form) { + if ( i.slice(0, 'oauth_') in self.oauth) { + // skip + } else { + delete oa['oauth_'+i] + } + } + self.headers.authorization = + 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') + self.headers.authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"' + } + + if (self.uri.auth && !self.headers.authorization) { + self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) + } + if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization']) { + self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) + } + + if (self.uri.path) { + self.path = self.uri.path + } else { + self.path = self.uri.pathname + (self.uri.search || "") + } + + if (self.path.length === 0) self.path = '/' + + if (self.proxy) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) + + if (self.json) { + self.headers['content-type'] = 'application/json' + if (typeof self.json === 'boolean') { + if (typeof self.body === 'object') self.body = JSON.stringify(self.body) + } else { + self.body = JSON.stringify(self.json) + } + + } else if (self.multipart) { + self.body = []; + self.headers['content-type'] = 'multipart/related;boundary="frontier"' + if (!self.multipart.forEach) throw new Error('Argument error, options.multipart.') + + self.multipart.forEach(function (part) { + var body = part.body + if(!body) throw Error('Body attribute missing in multipart.') + delete part.body + var preamble = '--frontier\r\n' + Object.keys(part).forEach(function(key){ + preamble += key + ': ' + part[key] + '\r\n' + }) + preamble += '\r\n'; + self.body.push(new Buffer(preamble)); + self.body.push(new Buffer(body)); + self.body.push(new Buffer('\r\n')); + }) + self.body.push(new Buffer('--frontier--')); + } + + if (self.body) { + var length = 0; + if (!Buffer.isBuffer(self.body)) { + if (Array.isArray(self.body)) { + for (var i = 0; i < self.body.length; i++) { + length += self.body[i].length; + } + } else { + self.body = new Buffer(self.body) + length = self.body.length; + } + } else { + length = self.body.length; + } + if (length) { + self.headers['content-length'] = length; + } else { + throw new Error('Argument error, options.body.') + } + } + + self.httpModule = + {"http:":http, "https:":https}[self.proxy ? self.proxy.protocol : self.uri.protocol] + + if (!self.httpModule) throw new Error("Invalid protocol") + + if (self.pool === false) { + self.agent = false + } else { + if (self.maxSockets) { + // Don't use our pooling if node has the refactored client + self.agent = self.httpModule.globalAgent || self.getAgent(self.host, self.port) + self.agent.maxSockets = self.maxSockets + } + if (self.pool.maxSockets) { + // Don't use our pooling if node has the refactored client + self.agent = self.httpModule.globalAgent || self.getAgent(self.host, self.port) + self.agent.maxSockets = self.pool.maxSockets + } + } + + self.start = function () { + self._started = true + self.method = self.method || 'GET' + + self.req = self.httpModule.request(self, function (response) { + self.response = response + response.request = self + + if (self.httpModule === https && + self.strictSSL && + !response.client.authorized) { + var sslErr = response.client.authorizationError + self.emit('error', new Error('SSL Error: '+ sslErr)) + return + } + + if (setHost) delete self.headers.host + if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer) + + if (response.headers['set-cookie'] && (!self._disableCookies)) { + response.headers['set-cookie'].forEach(function(cookie) { + if (self.jar) { + // custom defined jar + self.jar.add(new Cookie(cookie)); + } + else { + // add to the global cookie jar if user don't define his own + cookieJar.add(new Cookie(cookie)); + } + }); + } + + if (response.statusCode >= 300 && + response.statusCode < 400 && + self.followRedirect && + self.method !== 'PUT' && + self.method !== 'POST' && + response.headers.location) { + if (self._redirectsFollowed >= self.maxRedirects) { + self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop.")) + return + } + self._redirectsFollowed += 1 + + if (!isUrl.test(response.headers.location)) { + response.headers.location = url.resolve(self.uri.href, response.headers.location) + } + self.uri = response.headers.location + self.redirects.push( { statusCode : response.statusCode, + redirectUri: response.headers.location }) + delete self.req + delete self.agent + delete self._started + if (self.headers) { + delete self.headers.host + } + request(self, self.callback) + return // Ignore the rest of the response + } else { + self._redirectsFollowed = self._redirectsFollowed || 0 + // Be a good stream and emit end when the response is finished. + // Hack to emit end on close because of a core bug that never fires end + response.on('close', function () { + if (!self._ended) self.response.emit('end') + }) + + if (self.encoding) { + if (self.dests.length !== 0) { + console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") + } else { + response.setEncoding(self.encoding) + } + } + + self.pipeDest = function (dest) { + if (dest.headers) { + dest.headers['content-type'] = response.headers['content-type'] + if (response.headers['content-length']) { + dest.headers['content-length'] = response.headers['content-length'] + } + } + if (dest.setHeader) { + for (var i in response.headers) { + dest.setHeader(i, response.headers[i]) + } + dest.statusCode = response.statusCode + } + if (self.pipefilter) self.pipefilter(response, dest) + } + + self.dests.forEach(function (dest) { + self.pipeDest(dest) + }) + + response.on("data", function (chunk) { + self._destdata = true + self.emit("data", chunk) + }) + response.on("end", function (chunk) { + self._ended = true + self.emit("end", chunk) + }) + response.on("close", function () {self.emit("close")}) + + self.emit('response', response) + + if (self.onResponse) { + self.onResponse(null, response) + } + if (self.callback) { + var buffer = [] + var bodyLen = 0 + self.on("data", function (chunk) { + buffer.push(chunk) + bodyLen += chunk.length + }) + self.on("end", function () { + if (buffer.length && Buffer.isBuffer(buffer[0])) { + var body = new Buffer(bodyLen) + var i = 0 + buffer.forEach(function (chunk) { + chunk.copy(body, i, 0, chunk.length) + i += chunk.length + }) + response.body = body.toString() + } else if (buffer.length) { + response.body = buffer.join('') + } + + if (self.json) { + try { + response.body = JSON.parse(response.body) + } catch (e) {} + } + + self.callback(null, response, response.body) + }) + } + } + }) + + if (self.timeout) { + self.timeoutTimer = setTimeout(function() { + self.req.abort() + var e = new Error("ETIMEDOUT") + e.code = "ETIMEDOUT" + self.emit("error", e) + }, self.timeout) + } + + self.req.on('error', clientErrorHandler) + } + + self.once('pipe', function (src) { + if (self.ntick) throw new Error("You cannot pipe to this stream after the first nextTick() after creation of the request stream.") + self.src = src + if (isReadStream(src)) { + if (!self.headers['content-type'] && !self.headers['Content-Type']) + self.headers['content-type'] = mimetypes.lookup(src.path.slice(src.path.lastIndexOf('.')+1)) + } else { + if (src.headers) { + for (var i in src.headers) { + if (!self.headers[i]) { + self.headers[i] = src.headers[i] + } + } + } + if (src.method && !self.method) { + self.method = src.method + } + } + + self.on('pipe', function () { + console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") + }) + }) + + process.nextTick(function () { + if (self.body) { + if (Array.isArray(self.body)) { + self.body.forEach(function(part) { + self.write(part); + }); + } else { + self.write(self.body) + } + self.end() + } else if (self.requestBodyStream) { + console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") + self.requestBodyStream.pipe(self) + } else if (!self.src) { + self.headers['content-length'] = 0 + self.end() + } + self.ntick = true + }) +} +Request.prototype.pipe = function (dest) { + if (this.response) { + if (this._destdata) { + throw new Error("You cannot pipe after data has been emitted from the response.") + } else if (this._ended) { + throw new Error("You cannot pipe after the response has been ended.") + } else { + stream.Stream.prototype.pipe.call(this, dest) + this.pipeDest(dest) + return dest + } + } else { + this.dests.push(dest) + stream.Stream.prototype.pipe.call(this, dest) + return dest + } +} +Request.prototype.write = function () { + if (!this._started) this.start() + if (!this.req) throw new Error("This request has been piped before http.request() was called.") + this.req.write.apply(this.req, arguments) +} +Request.prototype.end = function () { + if (!this._started) this.start() + if (!this.req) throw new Error("This request has been piped before http.request() was called.") + this.req.end.apply(this.req, arguments) +} +Request.prototype.pause = function () { + if (!this.response) throw new Error("This request has been piped before http.request() was called.") + this.response.pause.apply(this.response, arguments) +} +Request.prototype.resume = function () { + if (!this.response) throw new Error("This request has been piped before http.request() was called.") + this.response.resume.apply(this.response, arguments) +} + +function request (options, callback) { + if (typeof options === 'string') options = {uri:options} + if (callback) options.callback = callback + var r = new Request(options) + r.request() + return r +} + +module.exports = request + +request.defaults = function (options) { + var def = function (method) { + var d = function (opts, callback) { + if (typeof opts === 'string') opts = {uri:opts} + for (var i in options) { + if (opts[i] === undefined) opts[i] = options[i] + } + return method(opts, callback) + } + return d + } + var de = def(request) + de.get = def(request.get) + de.post = def(request.post) + de.put = def(request.put) + de.head = def(request.head) + de.del = def(request.del) + de.cookie = def(request.cookie) + de.jar = def(request.jar) + return de +} + +request.get = request +request.post = function (options, callback) { + if (typeof options === 'string') options = {uri:options} + options.method = 'POST' + return request(options, callback) +} +request.put = function (options, callback) { + if (typeof options === 'string') options = {uri:options} + options.method = 'PUT' + return request(options, callback) +} +request.head = function (options, callback) { + if (typeof options === 'string') options = {uri:options} + options.method = 'HEAD' + if (options.body || options.requestBodyStream || options.json || options.multipart) { + throw new Error("HTTP HEAD requests MUST NOT include a request body.") + } + return request(options, callback) +} +request.del = function (options, callback) { + if (typeof options === 'string') options = {uri:options} + options.method = 'DELETE' + return request(options, callback) +} +request.jar = function () { + return new CookieJar +} +request.cookie = function (str) { + if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") + return new Cookie(str) +} diff --git a/node_modules/request/mimetypes.js b/node_modules/request/mimetypes.js new file mode 100644 index 0000000..8691006 --- /dev/null +++ b/node_modules/request/mimetypes.js @@ -0,0 +1,146 @@ +// from http://github.com/felixge/node-paperboy +exports.types = { + "aiff":"audio/x-aiff", + "arj":"application/x-arj-compressed", + "asf":"video/x-ms-asf", + "asx":"video/x-ms-asx", + "au":"audio/ulaw", + "avi":"video/x-msvideo", + "bcpio":"application/x-bcpio", + "ccad":"application/clariscad", + "cod":"application/vnd.rim.cod", + "com":"application/x-msdos-program", + "cpio":"application/x-cpio", + "cpt":"application/mac-compactpro", + "csh":"application/x-csh", + "css":"text/css", + "deb":"application/x-debian-package", + "dl":"video/dl", + "doc":"application/msword", + "drw":"application/drafting", + "dvi":"application/x-dvi", + "dwg":"application/acad", + "dxf":"application/dxf", + "dxr":"application/x-director", + "etx":"text/x-setext", + "ez":"application/andrew-inset", + "fli":"video/x-fli", + "flv":"video/x-flv", + "gif":"image/gif", + "gl":"video/gl", + "gtar":"application/x-gtar", + "gz":"application/x-gzip", + "hdf":"application/x-hdf", + "hqx":"application/mac-binhex40", + "html":"text/html", + "ice":"x-conference/x-cooltalk", + "ico":"image/x-icon", + "ief":"image/ief", + "igs":"model/iges", + "ips":"application/x-ipscript", + "ipx":"application/x-ipix", + "jad":"text/vnd.sun.j2me.app-descriptor", + "jar":"application/java-archive", + "jpeg":"image/jpeg", + "jpg":"image/jpeg", + "js":"text/javascript", + "json":"application/json", + "latex":"application/x-latex", + "lsp":"application/x-lisp", + "lzh":"application/octet-stream", + "m":"text/plain", + "m3u":"audio/x-mpegurl", + "man":"application/x-troff-man", + "me":"application/x-troff-me", + "midi":"audio/midi", + "mif":"application/x-mif", + "mime":"www/mime", + "movie":"video/x-sgi-movie", + "mustache":"text/plain", + "mp4":"video/mp4", + "mpg":"video/mpeg", + "mpga":"audio/mpeg", + "ms":"application/x-troff-ms", + "nc":"application/x-netcdf", + "oda":"application/oda", + "ogm":"application/ogg", + "pbm":"image/x-portable-bitmap", + "pdf":"application/pdf", + "pgm":"image/x-portable-graymap", + "pgn":"application/x-chess-pgn", + "pgp":"application/pgp", + "pm":"application/x-perl", + "png":"image/png", + "pnm":"image/x-portable-anymap", + "ppm":"image/x-portable-pixmap", + "ppz":"application/vnd.ms-powerpoint", + "pre":"application/x-freelance", + "prt":"application/pro_eng", + "ps":"application/postscript", + "qt":"video/quicktime", + "ra":"audio/x-realaudio", + "rar":"application/x-rar-compressed", + "ras":"image/x-cmu-raster", + "rgb":"image/x-rgb", + "rm":"audio/x-pn-realaudio", + "rpm":"audio/x-pn-realaudio-plugin", + "rtf":"text/rtf", + "rtx":"text/richtext", + "scm":"application/x-lotusscreencam", + "set":"application/set", + "sgml":"text/sgml", + "sh":"application/x-sh", + "shar":"application/x-shar", + "silo":"model/mesh", + "sit":"application/x-stuffit", + "skt":"application/x-koan", + "smil":"application/smil", + "snd":"audio/basic", + "sol":"application/solids", + "spl":"application/x-futuresplash", + "src":"application/x-wais-source", + "stl":"application/SLA", + "stp":"application/STEP", + "sv4cpio":"application/x-sv4cpio", + "sv4crc":"application/x-sv4crc", + "svg":"image/svg+xml", + "swf":"application/x-shockwave-flash", + "tar":"application/x-tar", + "tcl":"application/x-tcl", + "tex":"application/x-tex", + "texinfo":"application/x-texinfo", + "tgz":"application/x-tar-gz", + "tiff":"image/tiff", + "tr":"application/x-troff", + "tsi":"audio/TSP-audio", + "tsp":"application/dsptype", + "tsv":"text/tab-separated-values", + "unv":"application/i-deas", + "ustar":"application/x-ustar", + "vcd":"application/x-cdlink", + "vda":"application/vda", + "vivo":"video/vnd.vivo", + "vrm":"x-world/x-vrml", + "wav":"audio/x-wav", + "wax":"audio/x-ms-wax", + "wma":"audio/x-ms-wma", + "wmv":"video/x-ms-wmv", + "wmx":"video/x-ms-wmx", + "wrl":"model/vrml", + "wvx":"video/x-ms-wvx", + "xbm":"image/x-xbitmap", + "xlw":"application/vnd.ms-excel", + "xml":"text/xml", + "xpm":"image/x-xpixmap", + "xwd":"image/x-xwindowdump", + "xyz":"chemical/x-pdb", + "zip":"application/zip", +}; + +exports.lookup = function(ext, defaultType) { + defaultType = defaultType || 'application/octet-stream'; + + return (ext in exports.types) + ? exports.types[ext] + : defaultType; +}; \ No newline at end of file diff --git a/node_modules/request/oauth.js b/node_modules/request/oauth.js new file mode 100644 index 0000000..25db669 --- /dev/null +++ b/node_modules/request/oauth.js @@ -0,0 +1,34 @@ +var crypto = require('crypto') + , qs = require('querystring') + ; + +function sha1 (key, body) { + return crypto.createHmac('sha1', key).update(body).digest('base64') +} + +function rfc3986 (str) { + return encodeURIComponent(str) + .replace('!','%21') + .replace('*','%2A') + .replace('(','%28') + .replace(')','%29') + .replace("'",'%27') + ; +} + +function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret, body) { + // adapted from https://dev.twitter.com/docs/auth/oauth + var base = + httpMethod + "&" + + encodeURIComponent( base_uri ) + "&" + + Object.keys(params).sort().map(function (i) { + // big WTF here with the escape + encoding but it's what twitter wants + return escape(rfc3986(i)) + "%3D" + escape(rfc3986(params[i])) + }).join("%26") + var key = consumer_secret + '&' + if (token_secret) key += token_secret + return sha1(key, base) +} + +exports.hmacsign = hmacsign +exports.rfc3986 = rfc3986 \ No newline at end of file diff --git a/node_modules/request/package.json b/node_modules/request/package.json new file mode 100644 index 0000000..b549f06 --- /dev/null +++ b/node_modules/request/package.json @@ -0,0 +1,32 @@ +{ + "name": "request", + "description": "Simplified HTTP request client.", + "tags": [ + "http", + "simple", + "util", + "utility" + ], + "version": "2.2.9", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com" + }, + "repository": { + "type": "git", + "url": "http://github.com/mikeal/request.git" + }, + "bugs": { + "url": "http://github.com/mikeal/request/issues" + }, + "engines": [ + "node >= 0.3.6" + ], + "main": "./main", + "scripts": { + "test": "bash tests/run.sh" + }, + "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
\n  npm install request\n
\n\nOr from source:\n\n
\n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It support HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\n\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `onResponse` - If true the callback will be fired on the \"response\" event instead of \"end\". If a function it will be called on \"response\" and not effect the regular semantics of the main callback on \"end\".\n* `encoding` - Encoding to be used on response.setEncoding when buffering the response data.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", + "_id": "request@2.2.9", + "_from": "request@~2.2.9" +} diff --git a/node_modules/request/tests/googledoodle.png b/node_modules/request/tests/googledoodle.png new file mode 100644 index 0000000000000000000000000000000000000000..f80c9c52d3c507996535a19ee0bcfe3821de322d GIT binary patch literal 38510 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 literal 0 HcmV?d00001 diff --git a/node_modules/request/tests/run.sh b/node_modules/request/tests/run.sh new file mode 100755 index 0000000..57d0f64 --- /dev/null +++ b/node_modules/request/tests/run.sh @@ -0,0 +1,6 @@ +FAILS=0 +for i in tests/test-*.js; do + echo $i + node $i || let FAILS++ +done +exit $FAILS diff --git a/node_modules/request/tests/server.js b/node_modules/request/tests/server.js new file mode 100644 index 0000000..bad1e50 --- /dev/null +++ b/node_modules/request/tests/server.js @@ -0,0 +1,57 @@ +var http = require('http') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + ; + +exports.createServer = function (port) { + port = port || 6767 + var s = http.createServer(function (req, resp) { + s.emit(req.url, req, resp); + }) + s.port = port + s.url = 'http://localhost:'+port + return s; +} + +exports.createPostStream = function (text) { + var postStream = new stream.Stream(); + postStream.writeable = true; + postStream.readable = true; + setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); + return postStream; +} +exports.createPostValidator = function (text) { + var l = function (req, resp) { + var r = ''; + req.on('data', function (chunk) {r += chunk}) + req.on('end', function () { + if (r !== text) console.log(r, text); + assert.equal(r, text) + resp.writeHead(200, {'content-type':'text/plain'}) + resp.write('OK') + resp.end() + }) + } + return l; +} +exports.createGetResponse = function (text, contentType) { + var l = function (req, resp) { + contentType = contentType || 'text/plain' + resp.writeHead(200, {'content-type':contentType}) + resp.write(text) + resp.end() + } + return l; +} +exports.createChunkResponse = function (chunks, contentType) { + var l = function (req, resp) { + contentType = contentType || 'text/plain' + resp.writeHead(200, {'content-type':contentType}) + chunks.forEach(function (chunk) { + resp.write(chunk) + }) + resp.end() + } + return l; +} diff --git a/node_modules/request/tests/test-body.js b/node_modules/request/tests/test-body.js new file mode 100644 index 0000000..18ad5b9 --- /dev/null +++ b/node_modules/request/tests/test-body.js @@ -0,0 +1,90 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , request = require('../main.js') + ; + +var s = server.createServer(); + +var tests = + { testGet : + { resp : server.createGetResponse("TESTING!") + , expectBody: "TESTING!" + } + , testGetChunkBreak : + { resp : server.createChunkResponse( + [ new Buffer([239]) + , new Buffer([163]) + , new Buffer([191]) + , new Buffer([206]) + , new Buffer([169]) + , new Buffer([226]) + , new Buffer([152]) + , new Buffer([131]) + ]) + , expectBody: "Ω☃" + } + , testGetJSON : + { resp : server.createGetResponse('{"test":true}', 'application/json') + , json : true + , expectBody: {"test":true} + } + , testPutString : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : "PUTTINGDATA" + } + , testPutBuffer : + { resp : server.createPostValidator("PUTTINGDATA") + , method : "PUT" + , body : new Buffer("PUTTINGDATA") + } + , testPutJSON : + { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) + , method: "PUT" + , json: {foo: 'bar'} + } + , testPutMultipart : + { resp: server.createPostValidator( + '--frontier\r\n' + + 'content-type: text/html\r\n' + + '\r\n' + + 'Oh hi.' + + '\r\n--frontier\r\n\r\n' + + 'Oh hi.' + + '\r\n--frontier--' + ) + , method: "PUT" + , multipart: + [ {'content-type': 'text/html', 'body': 'Oh hi.'} + , {'body': 'Oh hi.'} + ] + } + } + +s.listen(s.port, function () { + + var counter = 0 + + for (i in tests) { + (function () { + var test = tests[i] + s.on('/'+i, test.resp) + test.uri = s.url + '/' + i + request(test, function (err, resp, body) { + if (err) throw err + if (test.expectBody) { + assert.deepEqual(test.expectBody, body) + } + counter = counter - 1; + if (counter === 0) { + console.log(Object.keys(tests).length+" tests passed.") + s.close() + } + }) + counter++ + })() + } +}) + diff --git a/node_modules/request/tests/test-cookie.js b/node_modules/request/tests/test-cookie.js new file mode 100644 index 0000000..aeafd10 --- /dev/null +++ b/node_modules/request/tests/test-cookie.js @@ -0,0 +1,29 @@ +var Cookie = require('../vendor/cookie') + , assert = require('assert'); + +var str = 'sid=s543qactge.wKE61E01Bs%2BKhzmxrwrnug; path=/; httpOnly; expires=Sat, 04 Dec 2010 23:27:28 GMT'; +var cookie = new Cookie(str); + +// test .toString() +assert.equal(cookie.toString(), str); + +// test .path +assert.equal(cookie.path, '/'); + +// test .httpOnly +assert.equal(cookie.httpOnly, true); + +// test .name +assert.equal(cookie.name, 'sid'); + +// test .value +assert.equal(cookie.value, 's543qactge.wKE61E01Bs%2BKhzmxrwrnug'); + +// test .expires +assert.equal(cookie.expires instanceof Date, true); + +// test .path default +var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); +assert.equal(cookie.path, '/bar'); + +console.log('All tests passed'); diff --git a/node_modules/request/tests/test-cookiejar.js b/node_modules/request/tests/test-cookiejar.js new file mode 100644 index 0000000..76fcd71 --- /dev/null +++ b/node_modules/request/tests/test-cookiejar.js @@ -0,0 +1,90 @@ +var Cookie = require('../vendor/cookie') + , Jar = require('../vendor/cookie/jar') + , assert = require('assert'); + +function expires(ms) { + return new Date(Date.now() + ms).toUTCString(); +} + +// test .get() expiration +(function() { + var jar = new Jar; + var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); + jar.add(cookie); + setTimeout(function(){ + var cookies = jar.get({ url: 'http://foo.com/foo' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], cookie); + setTimeout(function(){ + var cookies = jar.get({ url: 'http://foo.com/foo' }); + assert.equal(cookies.length, 0); + }, 1000); + }, 5); +})(); + +// test .get() path support +(function() { + var jar = new Jar; + var a = new Cookie('sid=1234; path=/'); + var b = new Cookie('sid=1111; path=/foo/bar'); + var c = new Cookie('sid=2222; path=/'); + jar.add(a); + jar.add(b); + jar.add(c); + + // should remove the duplicates + assert.equal(jar.cookies.length, 2); + + // same name, same path, latter prevails + var cookies = jar.get({ url: 'http://foo.com/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], c); + + // same name, diff path, path specifity prevails, latter prevails + var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], b); + + var jar = new Jar; + var a = new Cookie('sid=1111; path=/foo/bar'); + var b = new Cookie('sid=1234; path=/'); + jar.add(a); + jar.add(b); + + var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], a); + + var cookies = jar.get({ url: 'http://foo.com/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], b); + + var jar = new Jar; + var a = new Cookie('sid=1111; path=/foo/bar'); + var b = new Cookie('sid=3333; path=/foo/bar'); + var c = new Cookie('pid=3333; path=/foo/bar'); + var d = new Cookie('sid=2222; path=/foo/'); + var e = new Cookie('sid=1234; path=/'); + jar.add(a); + jar.add(b); + jar.add(c); + jar.add(d); + jar.add(e); + + var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); + assert.equal(cookies.length, 2); + assert.equal(cookies[0], b); + assert.equal(cookies[1], c); + + var cookies = jar.get({ url: 'http://foo.com/foo/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], d); + + var cookies = jar.get({ url: 'http://foo.com/' }); + assert.equal(cookies.length, 1); + assert.equal(cookies[0], e); +})(); + +setTimeout(function() { + console.log('All tests passed'); +}, 1200); diff --git a/node_modules/request/tests/test-errors.js b/node_modules/request/tests/test-errors.js new file mode 100644 index 0000000..a7db1f7 --- /dev/null +++ b/node_modules/request/tests/test-errors.js @@ -0,0 +1,30 @@ +var server = require('./server') + , events = require('events') + , assert = require('assert') + , request = require('../main.js') + ; + +var local = 'http://localhost:8888/asdf' + +try { + request({uri:local, body:{}}) + assert.fail("Should have throw") +} catch(e) { + assert.equal(e.message, 'Argument error, options.body.') +} + +try { + request({uri:local, multipart: 'foo'}) + assert.fail("Should have throw") +} catch(e) { + assert.equal(e.message, 'Argument error, options.multipart.') +} + +try { + request({uri:local, multipart: [{}]}) + assert.fail("Should have throw") +} catch(e) { + assert.equal(e.message, 'Body attribute missing in multipart.') +} + +console.log("All tests passed.") diff --git a/node_modules/request/tests/test-oauth.js b/node_modules/request/tests/test-oauth.js new file mode 100644 index 0000000..7d969a0 --- /dev/null +++ b/node_modules/request/tests/test-oauth.js @@ -0,0 +1,109 @@ +var hmacsign = require('../oauth').hmacsign + , assert = require('assert') + , qs = require('querystring') + , request = require('../main') + ; + +function getsignature (r) { + var sign + r.headers.authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { + if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) + }) + return decodeURIComponent(sign) +} + +// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth + +var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', + { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' + , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' + , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' + , oauth_signature_method: 'HMAC-SHA1' + , oauth_timestamp: '1272323042' + , oauth_version: '1.0' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") + +console.log(reqsign) +console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') +assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') + +var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', + { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' + , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' + , oauth_signature_method: 'HMAC-SHA1' + , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' + , oauth_timestamp: '1272323047' + , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' + , oauth_version: '1.0' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") + +console.log(accsign) +console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') +assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') + +var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', + { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" + , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" + , oauth_signature_method: "HMAC-SHA1" + , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" + , oauth_timestamp: "1272325550" + , oauth_version: "1.0" + , status: 'setting up my twitter 私のさえずりを設定する' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") + +console.log(upsign) +console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') +assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') + + +var r = request.post( + { url: 'https://api.twitter.com/oauth/request_token' + , oauth: + { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' + , consumer_key: 'GDdmIQH6jhtmLUypg82g' + , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' + , timestamp: '1272323042' + , version: '1.0' + , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" + } + }) + +console.log(getsignature(r)) +assert.equal(reqsign, getsignature(r)) + +var r = request.post( + { url: 'https://api.twitter.com/oauth/access_token' + , oauth: + { consumer_key: 'GDdmIQH6jhtmLUypg82g' + , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' + , signature_method: 'HMAC-SHA1' + , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' + , timestamp: '1272323047' + , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' + , version: '1.0' + , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" + , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" + } + }) + +console.log(getsignature(r)) +assert.equal(accsign, getsignature(r)) + +var r = request.post( + { url: 'http://api.twitter.com/1/statuses/update.json' + , oauth: + { consumer_key: "GDdmIQH6jhtmLUypg82g" + , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" + , signature_method: "HMAC-SHA1" + , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" + , timestamp: "1272325550" + , version: "1.0" + , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" + , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" + } + , form: {status: 'setting up my twitter 私のさえずりを設定する'} + }) + +console.log(getsignature(r)) +assert.equal(upsign, getsignature(r)) + diff --git a/node_modules/request/tests/test-pipes.js b/node_modules/request/tests/test-pipes.js new file mode 100644 index 0000000..0774647 --- /dev/null +++ b/node_modules/request/tests/test-pipes.js @@ -0,0 +1,167 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , fs = require('fs') + , request = require('../main.js') + , path = require('path') + , util = require('util') + ; + +var s = server.createServer(3453); + +function ValidationStream(str) { + this.str = str + this.buf = '' + this.on('data', function (data) { + this.buf += data + }) + this.on('end', function () { + assert.equal(this.str, this.buf) + }) + this.writable = true +} +util.inherits(ValidationStream, stream.Stream) +ValidationStream.prototype.write = function (chunk) { + this.emit('data', chunk) +} +ValidationStream.prototype.end = function (chunk) { + if (chunk) emit('data', chunk) + this.emit('end') +} + +s.listen(s.port, function () { + counter = 0; + + var check = function () { + counter = counter - 1 + if (counter === 0) { + console.log('All tests passed.') + setTimeout(function () { + process.exit(); + }, 500) + } + } + + // Test pipeing to a request object + s.once('/push', server.createPostValidator("mydata")); + + var mydata = new stream.Stream(); + mydata.readable = true + + counter++ + var r1 = request.put({url:'http://localhost:3453/push'}, function () { + check(); + }) + mydata.pipe(r1) + + mydata.emit('data', 'mydata'); + mydata.emit('end'); + + + // Test pipeing from a request object. + s.once('/pull', server.createGetResponse("mypulldata")); + + var mypulldata = new stream.Stream(); + mypulldata.writable = true + + counter++ + request({url:'http://localhost:3453/pull'}).pipe(mypulldata) + + var d = ''; + + mypulldata.write = function (chunk) { + d += chunk; + } + mypulldata.end = function () { + assert.equal(d, 'mypulldata'); + check(); + }; + + + s.on('/cat', function (req, resp) { + if (req.method === "GET") { + resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); + resp.end('asdf') + } else if (req.method === "PUT") { + assert.equal(req.headers['content-type'], 'text/plain-test'); + assert.equal(req.headers['content-length'], 4) + var validate = ''; + + req.on('data', function (chunk) {validate += chunk}) + req.on('end', function () { + resp.writeHead(201); + resp.end(); + assert.equal(validate, 'asdf'); + check(); + }) + } + }) + s.on('/pushjs', function (req, resp) { + if (req.method === "PUT") { + assert.equal(req.headers['content-type'], 'text/javascript'); + check(); + } + }) + s.on('/catresp', function (req, resp) { + request.get('http://localhost:3453/cat').pipe(resp) + }) + s.on('/doodle', function (req, resp) { + if (req.headers['x-oneline-proxy']) { + resp.setHeader('x-oneline-proxy', 'yup') + } + resp.writeHead('200', {'content-type':'image/png'}) + fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) + }) + s.on('/onelineproxy', function (req, resp) { + var x = request('http://localhost:3453/doodle') + req.pipe(x) + x.pipe(resp) + }) + + counter++ + fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) + + counter++ + request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) + + counter++ + request.get('http://localhost:3453/catresp', function (e, resp, body) { + assert.equal(resp.headers['content-type'], 'text/plain-test'); + assert.equal(resp.headers['content-length'], 4) + check(); + }) + + var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) + + counter++ + request.get('http://localhost:3453/doodle').pipe(doodleWrite) + + doodleWrite.on('close', function () { + assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) + check() + }) + + process.on('exit', function () { + fs.unlinkSync(path.join(__dirname, 'test.png')) + }) + + counter++ + request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { + assert.equal(resp.headers['x-oneline-proxy'], 'yup') + check() + }) + + s.on('/afterresponse', function (req, resp) { + resp.write('d') + resp.end() + }) + + counter++ + var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { + var v = new ValidationStream('d') + afterresp.pipe(v) + v.on('end', check) + }) + +}) diff --git a/node_modules/request/tests/test-proxy.js b/node_modules/request/tests/test-proxy.js new file mode 100644 index 0000000..647157c --- /dev/null +++ b/node_modules/request/tests/test-proxy.js @@ -0,0 +1,39 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , fs = require('fs') + , request = require('../main.js') + , path = require('path') + , util = require('util') + ; + +var port = 6768 + , called = false + , proxiedHost = 'google.com' + ; + +var s = server.createServer(port) +s.listen(port, function () { + s.on('http://google.com/', function (req, res) { + called = true + assert.equal(req.headers.host, proxiedHost) + res.writeHeader(200) + res.end() + }) + request ({ + url: 'http://'+proxiedHost, + proxy: 'http://localhost:'+port + /* + //should behave as if these arguments where passed: + url: 'http://localhost:'+port, + headers: {host: proxiedHost} + //*/ + }, function (err, res, body) { + s.close() + }) +}) + +process.on('exit', function () { + assert.ok(called, 'the request must be made to the proxy server') +}) diff --git a/node_modules/request/tests/test-timeout.js b/node_modules/request/tests/test-timeout.js new file mode 100644 index 0000000..673f8ad --- /dev/null +++ b/node_modules/request/tests/test-timeout.js @@ -0,0 +1,87 @@ +var server = require('./server') + , events = require('events') + , stream = require('stream') + , assert = require('assert') + , request = require('../main.js') + ; + +var s = server.createServer(); +var expectedBody = "waited"; +var remainingTests = 5; + +s.listen(s.port, function () { + // Request that waits for 200ms + s.on('/timeout', function (req, resp) { + setTimeout(function(){ + resp.writeHead(200, {'content-type':'text/plain'}) + resp.write(expectedBody) + resp.end() + }, 200); + }); + + // Scenario that should timeout + var shouldTimeout = { + url: s.url + "/timeout", + timeout:100 + } + + + request(shouldTimeout, function (err, resp, body) { + assert.equal(err.code, "ETIMEDOUT"); + checkDone(); + }) + + + // Scenario that shouldn't timeout + var shouldntTimeout = { + url: s.url + "/timeout", + timeout:300 + } + + request(shouldntTimeout, function (err, resp, body) { + assert.equal(err, null); + assert.equal(expectedBody, body) + checkDone(); + }) + + // Scenario with no timeout set, so shouldn't timeout + var noTimeout = { + url: s.url + "/timeout" + } + + request(noTimeout, function (err, resp, body) { + assert.equal(err); + assert.equal(expectedBody, body) + checkDone(); + }) + + // Scenario with a negative timeout value, should be treated a zero or the minimum delay + var negativeTimeout = { + url: s.url + "/timeout", + timeout:-1000 + } + + request(negativeTimeout, function (err, resp, body) { + assert.equal(err.code, "ETIMEDOUT"); + checkDone(); + }) + + // Scenario with a float timeout value, should be rounded by setTimeout anyway + var floatTimeout = { + url: s.url + "/timeout", + timeout: 100.76 + } + + request(floatTimeout, function (err, resp, body) { + assert.equal(err.code, "ETIMEDOUT"); + checkDone(); + }) + + function checkDone() { + if(--remainingTests == 0) { + s.close(); + console.log("All tests passed."); + } + } +}) + diff --git a/node_modules/request/uuid.js b/node_modules/request/uuid.js new file mode 100644 index 0000000..1d83bd5 --- /dev/null +++ b/node_modules/request/uuid.js @@ -0,0 +1,19 @@ +module.exports = function () { + var s = [], itoh = '0123456789ABCDEF'; + + // Make array of random hex digits. The UUID only has 32 digits in it, but we + // allocate an extra items to make room for the '-'s we'll be inserting. + for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10); + + // Conform to RFC-4122, section 4.4 + s[14] = 4; // Set 4 high bits of time_high field to version + s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence + + // Convert to hex chars + for (var i = 0; i <36; i++) s[i] = itoh[s[i]]; + + // Insert '-'s + s[8] = s[13] = s[18] = s[23] = '-'; + + return s.join(''); +} diff --git a/node_modules/request/vendor/cookie/index.js b/node_modules/request/vendor/cookie/index.js new file mode 100644 index 0000000..d8f29b3 --- /dev/null +++ b/node_modules/request/vendor/cookie/index.js @@ -0,0 +1,55 @@ +/*! + * Tobi - Cookie + * Copyright(c) 2010 LearnBoost + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var url = require('url'); + +/** + * Initialize a new `Cookie` with the given cookie `str` and `req`. + * + * @param {String} str + * @param {IncomingRequest} req + * @api private + */ + +var Cookie = exports = module.exports = function Cookie(str, req) { + this.str = str; + + // First key is the name + this.name = str.substr(0, str.indexOf('=')); + + // Map the key/val pairs + str.split(/ *; */).reduce(function(obj, pair){ + pair = pair.split(/ *= */); + obj[pair[0].toLowerCase()] = pair[1] || true; + return obj; + }, this); + + // Assign value + this.value = this[this.name]; + + // Expires + this.expires = this.expires + ? new Date(this.expires) + : Infinity; + + // Default or trim path + this.path = this.path || '/'; +}; + +/** + * Return the original cookie string. + * + * @return {String} + * @api public + */ + +Cookie.prototype.toString = function(){ + return this.str; +}; diff --git a/node_modules/request/vendor/cookie/jar.js b/node_modules/request/vendor/cookie/jar.js new file mode 100644 index 0000000..34920e0 --- /dev/null +++ b/node_modules/request/vendor/cookie/jar.js @@ -0,0 +1,72 @@ +/*! +* Tobi - CookieJar +* Copyright(c) 2010 LearnBoost +* MIT Licensed +*/ + +/** +* Module dependencies. +*/ + +var url = require('url'); + +/** +* Initialize a new `CookieJar`. +* +* @api private +*/ + +var CookieJar = exports = module.exports = function CookieJar() { + this.cookies = []; +}; + +/** +* Add the given `cookie` to the jar. +* +* @param {Cookie} cookie +* @api private +*/ + +CookieJar.prototype.add = function(cookie){ + this.cookies = this.cookies.filter(function(c){ + // Avoid duplication (same path, same name) + return !(c.name == cookie.name && c.path == cookie.path); + }); + this.cookies.push(cookie); +}; + +/** +* Get cookies for the given `req`. +* +* @param {IncomingRequest} req +* @return {Array} +* @api private +*/ + +CookieJar.prototype.get = function(req){ + var path = url.parse(req.url).pathname + , now = new Date + , specificity = {}; + return this.cookies.filter(function(cookie){ + if (0 == path.indexOf(cookie.path) && now < cookie.expires + && cookie.path.length > (specificity[cookie.name] || 0)) + return specificity[cookie.name] = cookie.path.length; + }); +}; + +/** +* Return Cookie string for the given `req`. +* +* @param {IncomingRequest} req +* @return {String} +* @api private +*/ + +CookieJar.prototype.cookieString = function(req){ + var cookies = this.get(req); + if (cookies.length) { + return cookies.map(function(cookie){ + return cookie.name + '=' + cookie.value; + }).join('; '); + } +}; diff --git a/node_modules/vows/.npmignore b/node_modules/vows/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/vows/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/vows/.travis.yml b/node_modules/vows/.travis.yml new file mode 100644 index 0000000..aa1dc39 --- /dev/null +++ b/node_modules/vows/.travis.yml @@ -0,0 +1,6 @@ +language: node_js + +node_js: + - 0.4 + - 0.6 + diff --git a/node_modules/vows/LICENSE b/node_modules/vows/LICENSE new file mode 100644 index 0000000..a1edd93 --- /dev/null +++ b/node_modules/vows/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2009 cloudhead + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vows/Makefile b/node_modules/vows/Makefile new file mode 100644 index 0000000..6bf8991 --- /dev/null +++ b/node_modules/vows/Makefile @@ -0,0 +1,7 @@ +# +# Run all tests +# +test: + @@bin/vows test/* + +.PHONY: test install diff --git a/node_modules/vows/README.md b/node_modules/vows/README.md new file mode 100644 index 0000000..bfa410e --- /dev/null +++ b/node_modules/vows/README.md @@ -0,0 +1,65 @@ +Vows +==== + +> Asynchronous BDD & continuous integration for node.js + +#### # + +introduction +------------ +There are two reasons why we might want asynchronous testing. The first, and obvious reason is that node.js is asynchronous, and therefore our tests need to be. The second reason is to make test suites which target I/O libraries run much faster. + +_Vows_ is an experiment in making this possible, while adding a minimum of overhead. + +synopsis +-------- + + var vows = require('vows'), + assert = require('assert'); + + vows.describe('Deep Thought').addBatch({ + 'An instance of DeepThought': { + topic: new DeepThought, + + 'should know the answer to the ultimate question of life': function (deepThought) { + assert.equal (deepThought.question('what is the answer to the universe?'), 42); + } + } + }); + +coverage reporting +------------------ +Code coverage reporting is available if _instrumented_ code is detected. Currently only _instrumentation_ via [node-jscoverage](https://github.com/visionmedia/node-jscoverage) is supported. When _instrumented_ code is detected and coverage reporting is enabled using any of the `--cover-plain`, `--cover-html`, or `--cover-json` options a code coverage map is generated. + +### downloading and installing [node-jscoverage](https://github.com/visionmedia/node-jscoverage) +[node-jscoverage](https://github.com/visionmedia/node-jscoverage) is a binary package that needs to be compiled from source: + + $ git clone https://github.com/visionmedia/node-jscoverage.git + $ cd node-jscoverage/ + $ ./configure + checking for a BSD-compatible install... /usr/bin/install -c + checking whether build environment is sane... yes + [...] + $ make && sudo make install + +### instrumenting with jscoverage + + $ jscoverage myfile.js myfile-instrumented.js + +installation +------------ + + $ npm install vows + +documentation +------------- + +Head over to + +authors +------- + +Alexis Sellier <>, Charlie Robbins, + +*...and many others* + diff --git a/node_modules/vows/bin/vows b/node_modules/vows/bin/vows new file mode 100755 index 0000000..2694549 --- /dev/null +++ b/node_modules/vows/bin/vows @@ -0,0 +1,579 @@ +#!/usr/bin/env node + +var path = require('path'), + fs = require('fs'), + util = require('util'), + events = require('events'); + +// +// Attempt to load Coffee-Script. If it's not available, continue on our +// merry way, if it is available, start searching for `*.coffee` scripts too. +// +var fileExt, specFileExt; + +try { + var coffee = require('coffee-script'); + fileExt = /\.(js|coffee)$/; + specFileExt = /[.(-|_)]((t|T)est|(s|S)pec)\.(js|coffee)$/; +} catch (_) { + fileExt = /\.js$/; + specFileExt = /[.(-|_)]((t|T)est|(s|S)pec)\.js$/; +} + +var inspect = require('eyes').inspector({ + stream: null, + styles: { string: 'grey', regexp: 'grey' } +}); + +var vows = require('../lib/vows'); +var cutils = require('../lib/vows/console'); +var stylize = require('../lib/vows/console').stylize; +var _reporter = require('../lib/vows/reporters/dot-matrix'), reporter = { + name: _reporter.name +}; +var _coverage; + +var nodeMinorVersion = parseInt(process.version.split('.')[1], 10); + +var help = [ + "usage: vows [FILE, ...] [options]", + "", + "options:", + " -v, --verbose Enable verbose output", + " -w, --watch Watch mode", + " -s, --silent Don't report", + " -i, --isolate Run each test in it's own vows process", + " -m PATTERN Only run tests matching the PATTERN string", + " -r PATTERN Only run tests matching the PATTERN regexp", + " --json Use JSON reporter", + " --spec Use Spec reporter", + " --tap Use TAP reporter", + " --dot-matrix Use Dot-Matrix reporter", + " --xunit Use xUnit reporter", + " --cover-plain Print plain coverage map if detected", + " --cover-html Write coverage map to \"coverage.html\"", + " --cover-json Write unified coverage map to \"coverage.json\"", + " --cover-xml Write coverage map to \"coverage.xml\" in Emma xml", + " --no-color Don't use terminal colors", + " --version Show version", + " -h, --help You're staring at it" +].join('\n'); + +var options = { + reporter: reporter, + matcher: /.*/, + watch: false, + coverage: false, + isolate: false, + shuffle: false, + nocolor: !process.stdout.isTTY +}; + +var files = []; + +// Get rid of process runner +// ('node' in most cases) +var arg, args = [], argv = process.argv.slice(2); + +// Current directory index, +// and path of test folder. +var root, testFolder; + +// +// Parse command-line parameters +// +while (arg = argv.shift()) { + if (arg === __filename) { continue } + + if (arg[0] !== '-') { + args.push(arg); + } else { + arg = arg.match(/^--?(.+)/)[1]; + + if (arg[0] === 'r') { + options.matcher = new(RegExp)(argv.shift()); + } else if (arg[0] === 'm') { + options.matcher = (function (str) { // Create an escaped RegExp + var specials = '. * + ? | ( ) [ ] { } \\ ^ ? ! = : $'.split(' ').join('|\\'), + regex = new(RegExp)('(\\' + specials + ')', 'g'); + return new(RegExp)(str.replace(regex, '\\$1')); + })(argv.shift()); + } else if (arg in options) { + options[arg] = true; + } else { + switch (arg) { + case 'json': + _reporter = require('../lib/vows/reporters/json'); + break; + case 'spec': + _reporter = require('../lib/vows/reporters/spec'); + break; + case 'tap': + _reporter = require('../lib/vows/reporters/tap'); + break; + case 'dot-matrix': + _reporter = require('../lib/vows/reporters/dot-matrix'); + break; + case 'silent': + case 's': + _reporter = require('../lib/vows/reporters/silent'); + break; + case 'xunit': + _reporter = require('../lib/vows/reporters/xunit'); + break; + case 'cover-plain': + options.coverage = true; + _coverage = require('../lib/vows/coverage/report-plain'); + break; + case 'cover-html': + options.coverage = true; + _coverage = require('../lib/vows/coverage/report-html'); + break; + case 'cover-json': + options.coverage = true; + _coverage = require('../lib/vows/coverage/report-json'); + break; + case 'cover-xml': + options.coverage = true; + _coverage = require('../lib/vows/coverage/report-xml'); + break; + case 'verbose': + case 'v': + options.verbose = true; + break; + case 'watch': + case 'w': + options.watch = true; + break; + case 'supress-stdout': + options.supressStdout = true; + break; + case 'shuffle': + options.shuffle = true; + break; + case 'isolate': + case 'i': + options.isolate = true; + break; + case 'no-color': + options.nocolor = true; + break; + case 'color': + options.nocolor = false; + break; + case 'no-error': + options.error = false; + break; + case 'version': + console.log('vows ' + vows.version); + process.exit(0); + case 'help': + case 'h': + console.log(help); + process.exit(0); + break; + } + } + } +} + +if (options.nocolor) { + cutils.nocolor = true; + inspect = require('eyes').inspector({ stream: null, styles: false }); +} + +if (options.supressStdout) { + _reporter.setStream && _reporter.setStream(process.stdout); + var devNullStream = fs.createWriteStream('/dev/null'); + process.__defineGetter__('stdout', function () { + return devNullStream; + }); +} + +if (options.watch) { + options.reporter = reporter = require('../lib/vows/reporters/watch'); +} + +msg('bin', 'argv', args); +msg('bin', 'options', { reporter: options.reporter.name, matcher: options.matcher }); + +if (args.length === 0 || options.watch) { + msg('bin', 'discovering', 'folder structure'); + root = fs.readdirSync('.'); + + if (root.indexOf('test') !== -1) { + testFolder = 'test'; + } else if (root.indexOf('spec') !== -1) { + testFolder = 'spec'; + } else { + abort("runner", "couldn't find test folder"); + } + msg('bin', 'discovered', "./" + testFolder); + if (args.length === 0) { + args = paths(testFolder).filter(function (f) { + return specFileExt.test(f); + }); + + if (options.watch) { + args = args.concat(paths('lib'), paths('src')); + } + } +} + +if (! options.watch) { + reporter.report = function (data, filename) { + switch (data[0]) { + case 'subject': + case 'vow': + case 'context': + case 'error': + _reporter.report(data, filename); + break; + case 'end': + (options.verbose || _reporter.name === 'json') && + _reporter.report(data); + break; + case 'finish': + options.verbose ? + _reporter.print('\n') + : + _reporter.print(' '); + break; + } + }; + reporter.reset = function () { _reporter.reset && _reporter.reset() }; + reporter.print = _reporter.print; + + files = args.map(function (a) { + return (!a.match(/^\//)) + ? path.join(process.cwd(), a.replace(fileExt, '')) + : a.replace(fileExt, ''); + }); + + if (options.shuffle) { + var source = files.slice(0); + files.length = 0; + while (source.length) { + files.push(source.splice(Math.floor(Math.random() * source.length), 1)[0]); + } + } + + runSuites(importSuites(files), function (results) { + var status = results.errored ? 2 : (results.broken ? 1 : 0); + + !options.verbose && _reporter.print('\n'); + msg('runner', 'finish'); + _reporter.report(['finish', results], { + write: function (str) { + util.print(str.replace(/^\n\n/, '\n')); + } + }); + try { + if (options.coverage === true && _$jscoverage !== undefined) { + _coverage.report(_$jscoverage); + } + } catch (err) { + // ignore the undefined jscoverage + } + if (process.stdout.write('')) { // Check if stdout is drained + process.exit(status); + } else { + process.stdout.on('drain', function () { + process.exit(status); + }); + } + }); +} else { + // + // Watch mode + // + (function () { + var pendulum = [ + '. ', '.. ', '... ', ' ...', + ' ..', ' .', ' .', ' ..', + '... ', '.. ', '. ' + ]; + var strobe = ['.', ' ']; + var status, + cue, + current = 0, + running = 0, + lastRun, + colors = ['32m', '33m', '31m'], + timer = setInterval(tick, 100); + process.on('uncaughtException', exception); + process.on('exit', cleanup); + process.on('SIGINT', function () { + process.exit(0); + }); + process.on('SIGQUIT', function () { + changed(); + }); + + cursorHide(); + + // Run every 100ms + function tick() { + if (running && (cue !== strobe)) { + cue = strobe, current = 0; + } else if (!running && (cue !== pendulum)) { + cue = pendulum, current = 0; + } + + eraseLine(); + lastRun && !running && esc(colors[status.errored ? 2 : (status.broken ? 1 : 0)]); + print(cue[current]); + + if (current == cue.length - 1) { current = -1 } + + current ++; + esc('39m'); + cursorRestore(); + } + + // + // Utility functions + // + function print(str) { util.print(str) } + function esc(str) { print("\x1b[" + str) } + function eraseLine() { esc("0K") } + function cursorRestore() { esc("0G") } + function cursorHide() { esc("?25l") } + function cursorShow() { esc("?25h") } + function cleanup() { eraseLine(), cursorShow(), clearInterval(timer), print('\n') } + function exception(err) { print(err.stack || err.message || JSON.stringify(err)), running = 0} + + // + // Get a matching test for a given file + // + function getMatchingTest(file, join) { + join || (join = '-'); + var testFile; + if (specFileExt.test(file)) { + testFile = path.join(testFolder, file); + } + else { + var root, extension; + _s = file.split('.'), root = _s[0], extension = _s[1]; + testFile = path.join(testFolder, root + join + testFolder + "." + extension); + } + + try { + fs.statSync(testFile); + } catch (e) { + if (join == '-') { + return getMatchingTest(file, '_'); + } + else { + msg('watcher', 'no equivalence found, running all tests.'); + testFile = null; + } + } + return testFile; + } + + // + // Called when a file has been modified. + // Run the matching tests and change the status. + // + function changed(file) { + status = { honored: 0, broken: 0, errored: 0, pending: 0 }; + + msg('watcher', 'detected change in', file); + + file = getMatchingTest(file); + + var files = (specFileExt.test(file) ? [file] : paths(testFolder)).map(function (p) { + return path.join(process.cwd(), p); + }).filter(function (p) { + return specFileExt.test(p); + }).map(function (p) { + var cache = require.main.moduleCache || require.cache; + if (cache[p]) { delete(cache[p]) } + return p; + }).map(function (p) { + return p.replace(fileExt, ''); + }); + + running ++; + + runSuites(importSuites(files), function (results) { + delete(results.time); + print(cutils.result(results).join('') + '\n\n'); + lastRun = new(Date); + status = results; + running --; + }); + } + + msg('watcher', 'watching', args); + + // + // Watch all relevant files, + // and call `changed()` on change. + // + args.forEach(function (p) { + fs.watchFile(p, function (current, previous) { + if (new(Date)(current.mtime).valueOf() === + new(Date)(previous.mtime).valueOf()) { return } + else { + changed(p); + } + }); + }); + })(); +} + +function runSuites(suites, callback) { + var results = { + honored: 0, + broken: 0, + errored: 0, + pending: 0, + total: 0, + time: 0 + }; + reporter.reset(); + + (function run(suites, callback) { + var suite = suites.shift(); + if (suite) { + msg('runner', "running", suite.subject + ' ', options.watch ? false : true); + suite.run(options, function (result) { + Object.keys(result).forEach(function (k) { + results[k] += result[k]; + }); + run(suites, callback); + }); + } else { + callback(results); + } + })(suites, callback); +} + +function importSuites(files) { + msg(options.watcher ? 'watcher' : 'runner', 'loading', files); + + var spawn = require('child_process').spawn; + + function cwdname(f) { + return f.replace(process.cwd() + '/', '') + '.js'; + } + + function wrapSpawn(f) { + f = cwdname(f); + return function (options, callback) { + var args = [process.argv[1], '--json', '--supress-stdout', f], + p = spawn(process.execPath, args), + result; + + // + // AvianFlu, you broke the API! OH NOEZ. + // Anyway. + // Since node 0.7.something, semantics of child process events + // changed - `exit` event is emitted when child process exits + // and `close` event is emitted when child's streams stdio streams + // are closed. `exit` event is emitted before `close` event, and + // since we use child's stdio streams, we shouldn't rely on `exit` + // event. + // + p.on(nodeMinorVersion >= 7 ? 'close' : 'exit', function (code) { + callback( + !result ? + {errored: 1, total: 1} + : + result + ); + }); + + var buffer = []; + p.stdout.on('data', function (data) { + data = data.toString().split(/\n/g); + if (data.length == 1) { + buffer.push(data[0]); + } else { + data[0] = buffer.concat(data[0]).join(''); + buffer = [data.pop()]; + + data.forEach(function (data) { + if (data) { + data = JSON.parse(data); + if (data && data[0] === 'finish') { + result = data[1]; + } else { + reporter.report(data); + } + } + }); + } + }); + + p.stderr.pipe(process.stderr); + } + } + + return files.reduce(options.isolate ? function (suites, f) { + return suites.concat({ + run: wrapSpawn(f) + }); + } : function (suites, f) { + var obj = require(f); + return suites.concat(Object.keys(obj).map(function (s) { + obj[s]._filename = cwdname(f); + return obj[s]; + })); + }, []) +} + +// +// Recursively traverse a hierarchy, returning +// a list of all relevant .js files. +// +function paths(dir) { + var paths = []; + + try { fs.statSync(dir) } + catch (e) { return [] } + + (function traverse(dir, stack) { + stack.push(dir); + fs.readdirSync(stack.join('/')).forEach(function (file) { + // + // Skip dotfiles and `vendor` directory before `fs.stat()`ing them. + // Not doing so causes race conditions with Emacs buffer files + // (`.#filename.js`). + // + if (file[0] == '.' || file === 'vendor') { + return; + } + + var path = stack.concat([file]).join('/'), + stat = fs.statSync(path); + + if (stat.isFile() && fileExt.test(file)) { + paths.push(path); + } else if (stat.isDirectory()) { + traverse(file, stack); + } + }); + stack.pop(); + })(dir || '.', []); + + return paths; +} + +function msg(cmd, subject, str, p) { + if (options.verbose) { + util[p ? 'print' : 'puts']( stylize('vows ', 'green') + + stylize(cmd, 'bold') + + ' ' + subject + ' ' + + (str ? (typeof(str) === 'string' ? str : inspect(str)) : '') + ); + } +} + +function abort(cmd, str) { + console.log(stylize('vows ', 'red') + stylize(cmd, 'bold') + ' ' + str); + console.log(stylize('vows ', 'red') + stylize(cmd, 'bold') + ' exiting'); + process.exit(-1); +} diff --git a/node_modules/vows/lib/assert/error.js b/node_modules/vows/lib/assert/error.js new file mode 100644 index 0000000..b8fcf57 --- /dev/null +++ b/node_modules/vows/lib/assert/error.js @@ -0,0 +1,152 @@ +/** +This software contains code adapted from Mocha +(https://github.com/visionmedia/mocha) by TJ Holowaychuk +and is used herein under the following MIT license: + +Copyright (c) 2011-2012 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +var stylize = require('../vows/console').stylize; +var inspect = require('../vows/console').inspect; +var diff = require('diff'); + +/** + * Pad the given `str` to `len`. + * + * @param {String} str + * @param {String} len + * @return {String} + * @api private + */ + +function pad(str, len) { + str = String(str); + return Array(len - str.length + 1).join(' ') + str; +} + +/** + * Color lines for `str`, using the color `name`. + * + * @param {String} name + * @param {String} str + * @return {String} + * @api private + */ + +function styleLines(str, name) { + return str.split('\n').map(function(str){ + return stylize(str, name); + }).join('\n'); +} + +/** + * Return a character diff for `err`. + * + * @param {Error} err + * @return {String} + * @api private + */ + +function errorDiff(err, type) { + return diff['diff' + type](err.actual, err.expected).map(function(str){ + if (/^(\n+)$/.test(str.value)) str.value = Array(++RegExp.$1.length).join(''); + if (str.added) return styleLines(str.value, 'green'); + if (str.removed) return styleLines(str.value, 'red'); + return str.value; + }).join(''); +} + +require('assert').AssertionError.prototype.toString = function () { + var that = this, + source; + + if (this.stack) { + source = this.stack.match(/([a-zA-Z0-9._-]+\.(?:js|coffee))(:\d+):\d+/); + } + + function parse(str) { + var actual = that.actual, + expected = that.expected, + msg, len; + + if ( + 'string' === typeof actual && + 'string' === typeof expected + ) { + len = Math.max(actual.length, expected.length); + + if (len < 20) msg = errorDiff(that, 'Chars'); + else msg = errorDiff(that, 'Words'); + + // linenos + var lines = msg.split('\n'); + if (lines.length > 4) { + var width = String(lines.length).length; + msg = lines.map(function(str, i){ + return pad(++i, width) + ' |' + ' ' + str; + }).join('\n'); + } + + // legend + msg = '\n' + + stylize('actual', 'green') + + ' ' + + stylize('expected', 'red') + + '\n\n' + + msg + + '\n'; + + // indent + msg = msg.replace(/^/gm, ' '); + + return msg; + } + + actual = inspect(actual, {showHidden: actual instanceof Error}); + + if (expected instanceof Function) { + expected = expected.name; + } + else { + expected = inspect(expected, {showHidden: actual instanceof Error}); + } + + return str.replace(/{actual}/g, actual). + replace(/{operator}/g, stylize(that.operator, 'bold')). + replace(/{expected}/g, expected); + } + + if (this.message) { + var msg = stylize(parse(this.message), 'yellow'); + if (source) { + msg += stylize(' // ' + source[1] + source[2], 'grey'); + } + return msg; + } else { + return stylize([ + this.expected, + this.operator, + this.actual + ].join(' '), 'yellow'); + } +}; + diff --git a/node_modules/vows/lib/assert/macros.js b/node_modules/vows/lib/assert/macros.js new file mode 100644 index 0000000..1e04e9e --- /dev/null +++ b/node_modules/vows/lib/assert/macros.js @@ -0,0 +1,222 @@ +var assert = require('assert'), + utils = require('./utils'); + +var messages = { + 'equal' : "expected {expected},\n\tgot\t {actual} ({operator})", + 'notEqual' : "didn't expect {actual} ({operator})" +}; +messages['strictEqual'] = messages['deepEqual'] = messages['equal']; +messages['notStrictEqual'] = messages['notDeepEqual'] = messages['notEqual']; + +for (var key in messages) { + assert[key] = (function (key, callback) { + return function (actual, expected, message) { + callback(actual, expected, message || messages[key]); + }; + })(key, assert[key]); +} + +assert.epsilon = function (eps, actual, expected, message) { + if (Math.abs(actual - expected) > eps) { + assert.fail(actual, expected, message || "expected {expected} \u00B1"+ eps +", but was {actual}"); + } +}; + +assert.ok = (function (callback) { + return function (actual, message) { + callback(actual, message || "expected expression to evaluate to {expected}, but was {actual}"); + }; +})(assert.ok); + +assert.match = function (actual, expected, message) { + if (! expected.test(actual)) { + assert.fail(actual, expected, message || "expected {actual} to match {expected}", "match", assert.match); + } +}; +assert.matches = assert.match; + +assert.isTrue = function (actual, message) { + if (actual !== true) { + assert.fail(actual, true, message || "expected {expected}, got {actual}", "===", assert.isTrue); + } +}; +assert.isFalse = function (actual, message) { + if (actual !== false) { + assert.fail(actual, false, message || "expected {expected}, got {actual}", "===", assert.isFalse); + } +}; +assert.isZero = function (actual, message) { + if (actual !== 0) { + assert.fail(actual, 0, message || "expected {expected}, got {actual}", "===", assert.isZero); + } +}; +assert.isNotZero = function (actual, message) { + if (actual === 0) { + assert.fail(actual, 0, message || "expected non-zero value, got {actual}", "===", assert.isNotZero); + } +}; + +assert.greater = function (actual, expected, message) { + if (actual <= expected) { + assert.fail(actual, expected, message || "expected {actual} to be greater than {expected}", ">", assert.greater); + } +}; +assert.lesser = function (actual, expected, message) { + if (actual >= expected) { + assert.fail(actual, expected, message || "expected {actual} to be lesser than {expected}", "<", assert.lesser); + } +}; + +assert.inDelta = function (actual, expected, delta, message) { + var lower = expected - delta; + var upper = expected + delta; + if (actual < lower || actual > upper) { + assert.fail(actual, expected, message || "expected {actual} to be in within *" + delta.toString() + "* of {expected}", null, assert.inDelta); + } +}; + +// +// Inclusion +// +assert.include = function (actual, expected, message) { + if ((function (obj) { + if (isArray(obj) || isString(obj)) { + return obj.indexOf(expected) === -1; + } else if (isObject(actual)) { + return ! obj.hasOwnProperty(expected); + } + return true; + })(actual)) { + assert.fail(actual, expected, message || "expected {actual} to include {expected}", "include", assert.include); + } +}; +assert.includes = assert.include; + +assert.deepInclude = function (actual, expected, message) { + if (!isArray(actual)) { + return assert.include(actual, expected, message); + } + if (!actual.some(function (item) { return utils.deepEqual(item, expected) })) { + assert.fail(actual, expected, message || "expected {actual} to include {expected}", "include", assert.deepInclude); + } +}; +assert.deepIncludes = assert.deepInclude; + +// +// Length +// +assert.isEmpty = function (actual, message) { + if ((isObject(actual) && Object.keys(actual).length > 0) || actual.length > 0) { + assert.fail(actual, 0, message || "expected {actual} to be empty", "length", assert.isEmpty); + } +}; +assert.isNotEmpty = function (actual, message) { + if ((isObject(actual) && Object.keys(actual).length === 0) || actual.length === 0) { + assert.fail(actual, 0, message || "expected {actual} to be not empty", "length", assert.isNotEmpty); + } +}; + +assert.lengthOf = function (actual, expected, message) { + var len = isObject(actual) ? Object.keys(actual).length : actual.length; + if (len !== expected) { + assert.fail(actual, expected, message || "expected {actual} to have {expected} element(s)", "length", assert.length); + } +}; + +// +// Type +// +assert.isArray = function (actual, message) { + assertTypeOf(actual, 'array', message || "expected {actual} to be an Array", assert.isArray); +}; +assert.isObject = function (actual, message) { + assertTypeOf(actual, 'object', message || "expected {actual} to be an Object", assert.isObject); +}; +assert.isNumber = function (actual, message) { + if (isNaN(actual)) { + assert.fail(actual, 'number', message || "expected {actual} to be of type {expected}", "isNaN", assert.isNumber); + } else { + assertTypeOf(actual, 'number', message || "expected {actual} to be a Number", assert.isNumber); + } +}; +assert.isBoolean = function (actual, message) { + if (actual !== true && actual !== false) { + assert.fail(actual, 'boolean', message || "expected {actual} to be a Boolean", "===", assert.isBoolean); + } +}; +assert.isNaN = function (actual, message) { + if (actual === actual) { + assert.fail(actual, 'NaN', message || "expected {actual} to be NaN", "===", assert.isNaN); + } +}; +assert.isNull = function (actual, message) { + if (actual !== null) { + assert.fail(actual, null, message || "expected {expected}, got {actual}", "===", assert.isNull); + } +}; +assert.isNotNull = function (actual, message) { + if (actual === null) { + assert.fail(actual, null, message || "expected non-null value, got {actual}", "===", assert.isNotNull); + } +}; +assert.isUndefined = function (actual, message) { + if (actual !== undefined) { + assert.fail(actual, undefined, message || "expected {actual} to be {expected}", "===", assert.isUndefined); + } +}; +assert.isDefined = function (actual, message) { + if(actual === undefined) { + assert.fail(actual, 0, message || "expected {actual} to be defined", "===", assert.isDefined); + } +}; +assert.isString = function (actual, message) { + assertTypeOf(actual, 'string', message || "expected {actual} to be a String", assert.isString); +}; +assert.isFunction = function (actual, message) { + assertTypeOf(actual, 'function', message || "expected {actual} to be a Function", assert.isFunction); +}; +assert.typeOf = function (actual, expected, message) { + assertTypeOf(actual, expected, message, assert.typeOf); +}; +assert.instanceOf = function (actual, expected, message) { + if (! (actual instanceof expected)) { + assert.fail(actual, expected, message || "expected {actual} to be an instance of {expected}", "instanceof", assert.instanceOf); + } +}; + +// +// Utility functions +// + +function assertTypeOf(actual, expected, message, caller) { + if (typeOf(actual) !== expected) { + assert.fail(actual, expected, message || "expected {actual} to be of type {expected}", "typeOf", caller); + } +}; + +function isArray (obj) { + return Array.isArray(obj); +} + +function isString (obj) { + return typeof(obj) === 'string' || obj instanceof String; +} + +function isObject (obj) { + return typeof(obj) === 'object' && obj && !isArray(obj); +} + +// A better `typeof` +function typeOf(value) { + var s = typeof(value), + types = [Object, Array, String, RegExp, Number, Function, Boolean, Date]; + + if (s === 'object' || s === 'function') { + if (value) { + types.forEach(function (t) { + if (value instanceof t) { s = t.name.toLowerCase() } + }); + } else { s = 'null' } + } + return s; +} diff --git a/node_modules/vows/lib/assert/utils.js b/node_modules/vows/lib/assert/utils.js new file mode 100644 index 0000000..dccd0f6 --- /dev/null +++ b/node_modules/vows/lib/assert/utils.js @@ -0,0 +1,77 @@ + +// Taken from node/lib/assert.js +exports.deepEqual = function (actual, expected) { + if (actual === expected) { + return true; + + } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + return true; + + } else if (actual instanceof Date && expected instanceof Date) { + return actual.getTime() === expected.getTime(); + + } else if (typeof actual != 'object' && typeof expected != 'object') { + return actual == expected; + + } else { + return objEquiv(actual, expected); + } +} + +// Taken from node/lib/assert.js +exports.notDeepEqual = function (actual, expected, message) { + if (exports.deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +} + +// Taken from node/lib/assert.js +function isUndefinedOrNull(value) { + return value === null || value === undefined; +} + +// Taken from node/lib/assert.js +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +// Taken from node/lib/assert.js +function objEquiv(a, b) { + if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) + return false; + if (a.prototype !== b.prototype) return false; + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return exports.deepEqual(a, b); + } + try { + var ka = Object.keys(a), + kb = Object.keys(b), + key, i; + } catch (e) { + return false; + } + if (ka.length != kb.length) + return false; + ka.sort(); + kb.sort(); + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!exports.deepEqual(a[key], b[key])) return false; + } + return true; +} + diff --git a/node_modules/vows/lib/vows.js b/node_modules/vows/lib/vows.js new file mode 100644 index 0000000..82324ef --- /dev/null +++ b/node_modules/vows/lib/vows.js @@ -0,0 +1,256 @@ +// +// Vows.js - asynchronous event-based BDD for node.js +// +// usage: +// +// var vows = require('vows'); +// +// vows.describe('Deep Thought').addBatch({ +// "An instance of DeepThought": { +// topic: new DeepThought, +// +// "should know the answer to the ultimate question of life": function (deepThought) { +// assert.equal (deepThought.question('what is the answer to the universe?'), 42); +// } +// } +// }).run(); +// +var util = require('util'), + path = require('path'), + events = require('events'), + vows = exports; + +// Options +vows.options = { + Emitter: events.EventEmitter, + reporter: require('./vows/reporters/dot-matrix'), + matcher: /.*/, + error: true // Handle "error" event +}; + +vows.__defineGetter__('reporter', function () { + return vows.options.reporter; +}); + +var stylize = require('./vows/console').stylize; +var console = vows.console = require('./vows/console'); + +vows.inspect = require('./vows/console').inspect; +vows.prepare = require('./vows/extras').prepare; +vows.tryEnd = require('./vows/suite').tryEnd; + +// +// Assertion Macros & Extensions +// +require('./assert/error'); +require('./assert/macros'); + +// +// Suite constructor +// +var Suite = require('./vows/suite').Suite; + +// +// This function gets added to events.EventEmitter.prototype, by default. +// It's essentially a wrapper around `on`, which adds all the specification +// goodness. +// +function addVow(vow) { + var batch = vow.batch, + event = vow.binding.context.event || 'success', + self = this; + + batch.total ++; + batch.vows.push(vow); + + // always set a listener on the event + this.on(event, function () { + var args = Array.prototype.slice.call(arguments); + // If the vow is a sub-event then we know it is an + // emitted event. So I don't muck with the arguments + // However the legacy behavior: + // If the callback is expecting two or more arguments, + // pass the error as the first (null) and the result after. + if (!(this.ctx && this.ctx.isEvent) && + vow.callback.length >= 2 && batch.suite.options.error) { + args.unshift(null); + } + runTest(args, this.ctx); + vows.tryEnd(batch); + }); + + if (event !== 'error') { + this.on("error", function (err) { + if (vow.callback.length >= 2 || !batch.suite.options.error) { + runTest(arguments, this.ctx); + } else { + output('errored', { type: 'promise', error: err.stack || + err.message || JSON.stringify(err) }); + } + vows.tryEnd(batch); + }); + } + + // in case an event fired before we could listen + if (this._vowsEmitedEvents && + this._vowsEmitedEvents.hasOwnProperty(event)) { + // make sure no one is messing with me + if (Array.isArray(this._vowsEmitedEvents[event])) { + // I don't think I need to optimize for one event, + // I think it is more important to make sure I check the vow n times + self._vowsEmitedEvents[event].forEach(function(args) { + runTest(args, self.ctx); + }); + } else { + // initial conditions problem + throw new Error('_vowsEmitedEvents[' + event + '] is not an Array') + } + vows.tryEnd(batch); + } + + return this; + + function runTest(args, ctx) { + if (vow.callback instanceof String) { + return output('pending'); + } + + if (vow.binding.context.isEvent && vow.binding.context.after) { + var after = vow.binding.context.after; + // only need to check order. I won't get here if the after event + // has never been emitted + if (self._vowsEmitedEventsOrder.indexOf(after) > + self._vowsEmitedEventsOrder.indexOf(event)) { + output('broken', event + ' emitted before ' + after); + return; + } + } + + // Run the test, and try to catch `AssertionError`s and other exceptions; + // increment counters accordingly. + try { + vow.callback.apply(ctx === global || !ctx ? vow.binding : ctx, args); + output('honored'); + } catch (e) { + if (e.name && e.name.match(/AssertionError/)) { + output('broken', e.toString().replace(/\`/g, '`')); + } else { + output('errored', e.stack || e.message || e); + } + } + } + + function output(status, exception) { + batch[status] ++; + vow.status = status; + + if (vow.context && batch.lastContext !== vow.context) { + batch.lastContext = vow.context; + batch.suite.report(['context', vow.context]); + } + batch.suite.report(['vow', { + title: vow.description, + context: vow.context, + status: status, + exception: exception || null + }]); + } +}; + +// +// On exit, check that all promises have been fired. +// If not, report an error message. +// +process.on('exit', function () { + var results = { honored: 0, broken: 0, errored: 0, pending: 0, total: 0 }, + failure; + + vows.suites.forEach(function (s) { + if ((s.results.total > 0) && (s.results.time === null)) { + s.reporter.print('\n\n'); + s.reporter.report(['error', { error: "Asynchronous Error", suite: s }]); + } + s.batches.forEach(function (b) { + var unFired = []; + + b.vows.forEach(function (vow) { + if (! vow.status) { + if (unFired.indexOf(vow.context) === -1) { + unFired.push(vow.context); + } + } + }); + + if (unFired.length > 0) { util.print('\n') } + + unFired.forEach(function (title) { + s.reporter.report(['error', { + error: "callback not fired", + context: title, + batch: b, + suite: s + }]); + }); + + if (b.status === 'begin') { + failure = true; + results.errored ++; + results.total ++; + } + Object.keys(results).forEach(function (k) { results[k] += b[k] }); + }); + }); + if (failure) { + util.puts(console.result(results)); + process.exit(1); + } +}); + +vows.suites = []; + +// We need the old emit function so we can hook it +// and do magic to deal with events that have fired +var oldEmit = vows.options.Emitter.prototype.emit; + +// +// Create a new test suite +// +vows.describe = function (subject) { + var suite = new(Suite)(subject); + + this.options.Emitter.prototype.addVow = addVow; + // just in case someone emit's before I get to it + this.options.Emitter.prototype.emit = function (event) { + this._vowsEmitedEvents = this._vowsEmitedEvents || {}; + this._vowsEmitedEventsOrder = this._vowsEmitedEventsOrder || []; + // slice off the event + var args = Array.prototype.slice.call(arguments, 1); + // if multiple events are fired, add or push + if (this._vowsEmitedEvents.hasOwnProperty(event)) { + this._vowsEmitedEvents[event].push(args); + } else { + this._vowsEmitedEvents[event] = [args]; + } + + // push the event onto a stack so I have an order + this._vowsEmitedEventsOrder.push(event); + return oldEmit.apply(this, arguments); + } + this.suites.push(suite); + + // + // Add any additional arguments as batches if they're present + // + if (arguments.length > 1) { + for (var i = 1, l = arguments.length; i < l; ++i) { + suite.addBatch(arguments[i]); + } + } + + return suite; +}; + + +vows.version = JSON.parse(require('fs') + .readFileSync(path.join(__dirname, '..', 'package.json'))) + .version diff --git a/node_modules/vows/lib/vows/console.js b/node_modules/vows/lib/vows/console.js new file mode 100644 index 0000000..900cef9 --- /dev/null +++ b/node_modules/vows/lib/vows/console.js @@ -0,0 +1,140 @@ +var eyes = require('eyes').inspector({ stream: null, styles: false }); + +// Stylize a string +this.stylize = function stylize(str, style) { + if (module.exports.nocolor) { + return str; + } + + var styles = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'cyan' : [96, 39], + 'yellow' : [33, 39], + 'green' : [32, 39], + 'red' : [31, 39], + 'grey' : [90, 39], + 'green-hi' : [92, 32], + }; + return '\033[' + styles[style][0] + 'm' + str + + '\033[' + styles[style][1] + 'm'; +}; + +var $ = this.$ = function (str) { + str = new(String)(str); + + ['bold', 'grey', 'yellow', 'red', 'green', 'white', 'cyan', 'italic'].forEach(function (style) { + Object.defineProperty(str, style, { + get: function () { + return exports.$(exports.stylize(this, style)); + } + }); + }); + return str; +}; + +this.puts = function (options) { + var stylize = exports.stylize; + options.stream || (options.stream = process.stdout); + options.tail = options.tail || ''; + + return function (args) { + args = Array.prototype.slice.call(arguments); + if (!options.raw) { + args = args.map(function (a) { + return a.replace(/`([^`]+)`/g, function (_, capture) { return stylize(capture, 'italic') }) + .replace(/\*([^*]+)\*/g, function (_, capture) { return stylize(capture, 'bold') }) + .replace(/\n/g, function (_, capture) { return ' \n ' } ); + }); + } + return options.stream.write(args.join('\n') + options.tail); + }; +}; + +this.result = function (event) { + var result = [], buffer = [], time = '', header; + var complete = event.honored + event.pending + event.errored + event.broken; + var status = (event.errored && 'errored') || (event.broken && 'broken') || + (event.honored && 'honored') || (event.pending && 'pending'); + + if (event.total === 0) { + return [$("Could not find any tests to run.").bold.red]; + } + + event.honored && result.push($(event.honored).bold + " honored"); + event.broken && result.push($(event.broken).bold + " broken"); + event.errored && result.push($(event.errored).bold + " errored"); + event.pending && result.push($(event.pending).bold + " pending"); + + if (complete < event.total) { + result.push($(event.total - complete).bold + " dropped"); + } + + result = result.join(' ∙ '); + + header = { + honored: '✓ ' + $('OK').bold.green, + broken: '✗ ' + $('Broken').bold.yellow, + errored: '✗ ' + $('Errored').bold.red, + pending: '- ' + $('Pending').bold.cyan + }[status] + ' » '; + + if (typeof(event.time) === 'number') { + time = ' (' + event.time.toFixed(3) + 's)'; + time = this.stylize(time, 'grey'); + } + buffer.push(header + result + time + '\n'); + + return buffer; +}; + +this.inspect = function inspect(val) { + if (module.exports.nocolor) { + return eyes(val); + } + + return '\033[1m' + eyes(val) + '\033[22m'; +}; + +this.error = function (obj) { + var string = '✗ ' + $('Errored ').red + '» '; + string += $(obj.error).red.bold + '\n'; + string += (obj.context ? ' in ' + $(obj.context).red + '\n': ''); + string += ' in ' + $(obj.suite.subject).red + '\n'; + string += ' in ' + $(obj.suite._filename).red; + + return string; +}; + +this.contextText = function (event) { + return ' ' + event; +}; + +this.vowText = function (event) { + var buffer = []; + + buffer.push(' ' + { + honored: ' ✓ ', + broken: ' ✗ ', + errored: ' ✗ ', + pending: ' - ' + }[event.status] + this.stylize(event.title, ({ + honored: 'green', + broken: 'yellow', + errored: 'red', + pending: 'cyan' + })[event.status])); + + if (event.status === 'broken') { + buffer.push(' » ' + event.exception); + } else if (event.status === 'errored') { + if (event.exception.type === 'promise') { + buffer.push(' » ' + this.stylize("An unexpected error was caught: " + + this.stylize(event.exception.error, 'bold'), 'red')); + } else { + buffer.push(' ' + this.stylize(event.exception, 'red')); + } + } + return buffer.join('\n'); +}; diff --git a/node_modules/vows/lib/vows/context.js b/node_modules/vows/lib/vows/context.js new file mode 100644 index 0000000..b11d676 --- /dev/null +++ b/node_modules/vows/lib/vows/context.js @@ -0,0 +1,76 @@ + +this.Context = function (vow, ctx, env) { + var that = this; + + this.tests = vow.callback; + this.topics = (ctx.topics || []).slice(0); + this.emitter = null; + this.env = env || {}; + this.env.context = this; + + this.env.callback = function (/* arguments */) { + var ctx = this; + var args = Array.prototype.slice.call(arguments); + + var emit = (function (args) { + // + // Convert callback-style results into events. + // + if (vow.batch.suite.options.error) { + return function () { + var e = args.shift(); + that.emitter.ctx = ctx; + // We handle a special case, where the first argument is a + // boolean, in which case we treat it as a result, and not + // an error. This is useful for `path.exists` and other + // functions like it, which only pass a single boolean + // parameter instead of the more common (error, result) pair. + if (typeof(e) === 'boolean' && args.length === 0) { + that.emitter.emit.call(that.emitter, 'success', e); + } else { + if (e) { that.emitter.emit.apply(that.emitter, ['error', e].concat(args)) } + else { that.emitter.emit.apply(that.emitter, ['success'].concat(args)) } + } + }; + } else { + return function () { + that.emitter.ctx = ctx; + that.emitter.emit.apply(that.emitter, ['success'].concat(args)); + }; + } + })(args.slice(0)); + // If `this.callback` is called synchronously, + // the emitter will not have been set yet, + // so we defer the emition, that way it'll behave + // asynchronously. + if (that.emitter) { emit() } + else { process.nextTick(emit) } + }; + this.name = vow.description; + // events is an alias for on + if (this.name === 'events') { + this.name = vow.description = 'on'; + } + + // if this is a sub-event context AND it's context was an event, + // then I must enforce event order. + // this will not do a good job of handling pin-pong events + if (this.name === 'on' && ctx.isEvent) { + this.after = ctx.name; + } + + if (ctx.name === 'on') { + this.isEvent = true; + this.event = this.name; + this.after = ctx.after; + } else { + this.isEvent = false; + this.event = 'success'; + } + + this.title = [ + ctx.title || '', + vow.description || '' + ].join(/^[#.:]/.test(vow.description) ? '' : ' ').trim(); +}; + diff --git a/node_modules/vows/lib/vows/coverage/file.js b/node_modules/vows/lib/vows/coverage/file.js new file mode 100644 index 0000000..5bdef90 --- /dev/null +++ b/node_modules/vows/lib/vows/coverage/file.js @@ -0,0 +1,29 @@ + +exports.coverage = function (filename, data) { + var ret = { + filename: filename, + coverage: 0, + hits: 0, + misses: 0, + sloc : 0 + }; + + var source = data.source; + ret.source = source.map(function (line, num) { + num++; + + if (data[num] === 0) { + ret.misses++; + ret.sloc++; + } else if (data[num] !== undefined) { + ret.hits++; + ret.sloc++; + } + + return { line: line, coverage: (data[num] === undefined ? '' : data[num]) }; + }); + + ret.coverage = (ret.hits / ret.sloc) * 100; + + return ret; +}; \ No newline at end of file diff --git a/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html b/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html new file mode 100644 index 0000000..9943ff0 --- /dev/null +++ b/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html @@ -0,0 +1,3 @@ + + + diff --git a/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html b/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html new file mode 100644 index 0000000..bd05d31 --- /dev/null +++ b/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html @@ -0,0 +1,300 @@ + + + + Coverage + + + + +
diff --git a/node_modules/vows/lib/vows/coverage/report-html.js b/node_modules/vows/lib/vows/coverage/report-html.js new file mode 100644 index 0000000..930a30b --- /dev/null +++ b/node_modules/vows/lib/vows/coverage/report-html.js @@ -0,0 +1,133 @@ +/** +This software contains code adapted from Mocha +(https://github.com/visionmedia/mocha) by TJ Holowaychuk +and is used herein under the following MIT license: + +Copyright (c) 20011-2012 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +var util = require('util'), + path = require('path'), + fs = require('fs'), + file = require('./file'); + +this.name = 'coverage-report-html'; + +function getCoverageClass( data ) { + var highCoverage= (data.coverage >= 80); + var okCoverage= (!highCoverage && data.coverage >=60); + var coverageClass= ''; + if( highCoverage ) coverageClass= 'high'; + else if( okCoverage) coverageClass= 'medium'; + else coverageClass= 'low'; + return coverageClass; +} +this.report = function (coverageMap) { + var out, head, foot, + files = [], summary = { + hits: 0, + misses: 0, + sloc: 0 + }; + + try { + out = fs.openSync("coverage.html", "w"); + head = fs.readFileSync(__dirname + "/fragments/coverage-head.html", "utf8"); + foot = fs.readFileSync(__dirname + "/fragments/coverage-foot.html", "utf8"); + } catch (error) { + util.print("Error: Unable to write to file coverage.html\n"); + return; + } + + fs.writeSync(out, head); + + for (var filename in coverageMap) { + if (coverageMap.hasOwnProperty(filename)) { + var data = file.coverage(filename, coverageMap[filename]); + data.filename = filename; + files.push(data); + summary.hits += data.hits; + summary.misses += data.misses; + summary.sloc += data.sloc; + } + } + + summary.coverage = (summary.hits / summary.sloc) * 100; + + fs.writeSync(out, '

Coverage

'); + + fs.writeSync(out, '
' + + '
' + summary.hits + + '
' + summary.misses + + '
' + summary.sloc + + '
' + summary.coverage.toFixed(0) + "%
"); + + files.forEach(function (data) { + var coverageClass = getCoverageClass(data); + fs.writeSync(out, '
'); + fs.writeSync(out, '

' + data.filename + '

\n'); + fs.writeSync(out, '
' + + '
' + data.hits + + '
' + data.misses + + '
' + data.sloc + + '
' + data.coverage.toFixed(0) + "%
"); + + fs.writeSync(out, ''); + + for (var i = 0, l = data.source.length; i < l; i++) { + var line = data.source[i], + klass = (line.coverage === 0 ? 'miss' : 'hit'); + + fs.writeSync(out, ''); + } + + fs.writeSync(out, "
LineHitsSource
' + i + + '' + line.coverage + + '' + line.line + '
\n"); + fs.writeSync(out, "
\n"); + }); + + fs.writeSync(out, foot); + fs.close(out); +}; diff --git a/node_modules/vows/lib/vows/coverage/report-json.js b/node_modules/vows/lib/vows/coverage/report-json.js new file mode 100644 index 0000000..bcbab25 --- /dev/null +++ b/node_modules/vows/lib/vows/coverage/report-json.js @@ -0,0 +1,54 @@ +var util = require('util'), + fs = require('fs'), + file = require('./file'); + +this.name = 'coverage-report-json'; + +this.report = function (coverageMap) { + var output = { + meta: { + "generator": "vowsjs", + "generated": new Date().toString(), + "instrumentation": "node-jscoverage", + "file-version": "1.0" + }, + files: [ ], + coverage: [ ] + }; + + + for (var filename in coverageMap) { + if (coverageMap.hasOwnProperty(filename)) { + var data = file.coverage(filename, coverageMap[filename]); + + var coverage = { + file: filename, + coverage: data.coverage.toFixed(2), + hits: data.hits, + misses: data.misses, + sloc: data.sloc, + source: { } + }; + + for (var i = 0; i < data.source.length; i++) { + coverage.source[i + 1] = { + line: data.source[i].line, + coverage: data.source[i].coverage + }; + } + + output.coverage.push(coverage); + + output.files.push(filename); + } + } + + try { + out = fs.openSync("coverage.json", "w"); + fs.writeSync(out, JSON.stringify(output)); + fs.close(out); + } catch (error) { + util.print("Error: Unable to write to file coverage.json\n"); + return; + } +}; diff --git a/node_modules/vows/lib/vows/coverage/report-plain.js b/node_modules/vows/lib/vows/coverage/report-plain.js new file mode 100644 index 0000000..9de7005 --- /dev/null +++ b/node_modules/vows/lib/vows/coverage/report-plain.js @@ -0,0 +1,38 @@ +var util = require('util'), + file = require('./file'); + +this.name = 'coverage-report-plain'; + +function lpad(str, width) { + str = String(str); + var n = width - str.length; + + if (n < 1) { + return str; + } + + while (n--) { + str = ' ' + str; + } + + return str; +} + + +this.report = function (coverageMap) { + for (var filename in coverageMap) { + if (coverageMap.hasOwnProperty(filename)) { + var data = file.coverage(filename, coverageMap[filename]); + + util.print(filename + ":\n"); + util.print("[ hits: " + data.hits + ", misses: " + data.misses); + util.print(", sloc: " + data.sloc + ", coverage: " + data.coverage.toFixed(2) + "% ]\n"); + + for (var i = 0; i < data.source.length; i++) { + util.print(lpad(data.source[i].coverage, 5) + " | " + data.source[i].line + "\n"); + } + + util.print("\n"); + } + } +}; diff --git a/node_modules/vows/lib/vows/coverage/report-xml.js b/node_modules/vows/lib/vows/coverage/report-xml.js new file mode 100644 index 0000000..b9ff95b --- /dev/null +++ b/node_modules/vows/lib/vows/coverage/report-xml.js @@ -0,0 +1,81 @@ +var fs = require('fs'), + file = require('./file'); + +this.name = 'coverage-report-xml'; + +this.report = function (coverageMap) { + var all = { + xml: '', + packages: 0, + files: 0, + lines: 0, + hits: 0 + }, + data = {}; + + // group data by path + for (var filename in coverageMap) { + if (coverageMap.hasOwnProperty(filename)) { + var pkg = (filename.indexOf('/') > 0) + ? filename.substr(0, filename.lastIndexOf('/')) + : filename; + if (!data[pkg]) { + data[pkg] = {}; + } + data[pkg][ (filename.indexOf('/')) + ? filename.substr(filename.lastIndexOf('/') + 1, filename.length) + : filename ] + = file.coverage(filename, coverageMap[filename]); + } + } + + // generate groups xml-fragment + for (var pkg in data) { + if (data.hasOwnProperty(pkg)) { + var pkgStat = { + xml: '', + files: 0, + lines: 0, + hits: 0 + }; + + all.xml += '\t\n'; + + for (var filename in data[pkg]) { + if (data[pkg].hasOwnProperty(filename)) { + pkgStat.files += 1; + pkgStat.lines += data[pkg][filename].sloc; + pkgStat.hits += data[pkg][filename].hits; + + pkgStat.xml += '\t\t\n' + + '\t\t\t\n' + + '\t\t\n'; + } + } + + all.packages += 1; + all.files += pkgStat.files; + all.lines += pkgStat.lines; + all.hits += pkgStat.hits; + + all.xml += '\t\t\n' + + pkgStat.xml + + '\t\n'; + } + } + + all.xml = '\n' + + '\n\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\n\n' + + '\n' + + '\t\n' + + all.xml + + '\n\n\n'; + + fs.writeFileSync('coverage.xml', all.xml); +}; diff --git a/node_modules/vows/lib/vows/extras.js b/node_modules/vows/lib/vows/extras.js new file mode 100644 index 0000000..a90d7a5 --- /dev/null +++ b/node_modules/vows/lib/vows/extras.js @@ -0,0 +1,28 @@ +var events = require('events'); +// +// Wrap a Node.js style async function into an EventEmmitter +// +this.prepare = function (obj, targets) { + targets.forEach(function (target) { + if (target in obj) { + obj[target] = (function (fun) { + return function () { + var args = Array.prototype.slice.call(arguments); + var ee = new(events.EventEmitter); + + args.push(function (err /* [, data] */) { + var args = Array.prototype.slice.call(arguments, 1); + + if (err) { ee.emit.apply(ee, ['error', err].concat(args)) } + else { ee.emit.apply(ee, ['success'].concat(args)) } + }); + fun.apply(obj, args); + + return ee; + }; + })(obj[target]); + } + }); + return obj; +}; + diff --git a/node_modules/vows/lib/vows/reporters/dot-matrix.js b/node_modules/vows/lib/vows/reporters/dot-matrix.js new file mode 100644 index 0000000..0ecf590 --- /dev/null +++ b/node_modules/vows/lib/vows/reporters/dot-matrix.js @@ -0,0 +1,67 @@ +var options = { tail: '' }, + console = require('../../vows/console'), + stylize = console.stylize, + puts = console.puts(options); +// +// Console reporter +// +var messages = [], lastContext; + +this.name = 'dot-matrix'; +this.setStream = function (s) { + options.stream = s; +}; + +this.reset = function () { + messages = []; + lastContext = null; +}; +this.report = function (data) { + var event = data[1]; + + switch (data[0]) { + case 'subject': + // messages.push(stylize(event, 'underline') + '\n'); + break; + case 'context': + break; + case 'vow': + if (event.status === 'honored') { + puts(stylize('·', 'green')); + } else if (event.status === 'pending') { + puts(stylize('-', 'cyan')); + } else { + if (lastContext !== event.context) { + lastContext = event.context; + messages.push(' ' + event.context); + } + if (event.status === 'broken') { + puts(stylize('✗', 'yellow')); + messages.push(console.vowText(event)); + } else if (event.status === 'errored') { + puts(stylize('✗', 'red')); + messages.push(console.vowText(event)); + } + messages.push(''); + } + break; + case 'end': + puts(' '); + break; + case 'finish': + if (messages.length) { + puts('\n\n' + messages.join('\n')); + } else { + puts(''); + } + puts(console.result(event).join('\n')); + break; + case 'error': + puts(console.error(event)); + break; + } +}; + +this.print = function (str) { + puts(str); +}; diff --git a/node_modules/vows/lib/vows/reporters/json.js b/node_modules/vows/lib/vows/reporters/json.js new file mode 100644 index 0000000..20c1366 --- /dev/null +++ b/node_modules/vows/lib/vows/reporters/json.js @@ -0,0 +1,33 @@ +var options = { tail: '\n', raw: true }; +var console = require('../../vows/console'); +var puts = console.puts(options); + +// +// Console JSON reporter +// +this.name = 'json'; +this.setStream = function (s) { + options.stream = s; +}; + +function removeCircularSuite(obj, suite) { + var result = {}; + + if (typeof obj !== 'object' || obj === null) return obj; + + Object.keys(obj).forEach(function(key) { + if (obj[key] === suite) { + result[key] = {}; + } else { + result[key] = removeCircularSuite(obj[key], suite || obj.suite); + } + }); + + return result; +}; + +this.report = function (obj) { + puts(JSON.stringify(removeCircularSuite(obj))); +}; + +this.print = function (str) {}; diff --git a/node_modules/vows/lib/vows/reporters/silent.js b/node_modules/vows/lib/vows/reporters/silent.js new file mode 100644 index 0000000..fe90a33 --- /dev/null +++ b/node_modules/vows/lib/vows/reporters/silent.js @@ -0,0 +1,8 @@ +// +// Silent reporter - "Shhh" +// +this.name = 'silent'; +this.reset = function () {}; +this.report = function () {}; +this.print = function () {}; + diff --git a/node_modules/vows/lib/vows/reporters/spec.js b/node_modules/vows/lib/vows/reporters/spec.js new file mode 100644 index 0000000..d1c6dd8 --- /dev/null +++ b/node_modules/vows/lib/vows/reporters/spec.js @@ -0,0 +1,42 @@ +var util = require('util'); + +var options = { tail: '\n' }; +var console = require('../../vows/console'); +var stylize = console.stylize, + puts = console.puts(options); +// +// Console reporter +// + +this.name = 'spec'; +this.setStream = function (s) { + options.stream = s; +}; +this.report = function (data) { + var event = data[1]; + + switch (data[0]) { + case 'subject': + puts('\n♢ ' + stylize(event, 'bold') + '\n'); + break; + case 'context': + puts(console.contextText(event)); + break; + case 'vow': + puts(console.vowText(event)); + break; + case 'end': + util.print('\n'); + break; + case 'finish': + puts(console.result(event).join('\n')); + break; + case 'error': + puts(console.error(event)); + break; + } +}; + +this.print = function (str) { + util.print(str); +}; diff --git a/node_modules/vows/lib/vows/reporters/tap.js b/node_modules/vows/lib/vows/reporters/tap.js new file mode 100644 index 0000000..ac5a2da --- /dev/null +++ b/node_modules/vows/lib/vows/reporters/tap.js @@ -0,0 +1,100 @@ +var options = { + tail: "\n" +}; +var console = require("../console"); +var stylize = console.stylize; +var puts = console.puts(options); + +// +// TAP Reporter +// + +this.name = "tap"; +this.setSTream = function setStream(s) { + options.stream = s; +}; + +var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; +var TapInterface = (function() { + function TapInterface() { + this.genOutput_ = __bind(this.genOutput_, this); + this.testCount = __bind(this.testCount, this); + this.bailOut = __bind(this.bailOut, this); + this.skip = __bind(this.skip, this); + this.notOk = __bind(this.notOk, this); + this.ok = __bind(this.ok, this); + this.count_ = 0; + } + + TapInterface.prototype.ok = function(description) { + return this.genOutput_("ok", ++this.count_, "- " + description); + }; + + TapInterface.prototype.notOk = function(description) { + return this.genOutput_("not ok", ++this.count_, "- " + description); + }; + + TapInterface.prototype.skip = function(description) { + return this.genOutput_("ok", ++this.count_, "# SKIP " + description); + }; + + TapInterface.prototype.bailOut = function(reason) { + return "Bail out!" + (reason !== null ? " " + reason : ""); + }; + + TapInterface.prototype.testCount = function() { + return "1.." + this.count_; + }; + + TapInterface.prototype.genOutput_ = function(status, testNumber, description) { + return "" + status + " " + testNumber + " " + description; + }; + + return TapInterface; +})(); + +var tap = new TapInterface(); + +this.report = function report(data) { + var type = data[0]; + var event = data[1]; + switch (type) { + case "subject": + puts("# " + stylize(event, "bold")); + break; + case "context": + puts("# " + event); + break; + case "vow": + switch (event.status) { + case "honored": + puts(tap.ok(event.title)); + break; + case "pending": + puts(tap.skip(event.title)); + break; + case "broken": + puts(tap.notOk(event.title + "\n# " + event.exception)); + break; + case "errored": + puts(tap.notOk(event.title)); + puts(tap.bailOut(event.exception)); + break; + } + break; + case "end": + puts("\n"); + break; + case "finish": + puts(tap.testCount()); + break; + case "error": + puts("#> Errored"); + puts("# " + JSON.stringify(data)); + break; + } +}; + +this.print = function print(str) { + require("util").print(str); +}; diff --git a/node_modules/vows/lib/vows/reporters/watch.js b/node_modules/vows/lib/vows/reporters/watch.js new file mode 100644 index 0000000..58f6e3c --- /dev/null +++ b/node_modules/vows/lib/vows/reporters/watch.js @@ -0,0 +1,37 @@ +var options = {}; +var console = require('../../vows/console'); +var spec = require('../../vows/reporters/spec'); +var stylize = console.stylize, + puts = console.puts(options); +// +// Console reporter +// +var lastContext; + +this.name = 'watch'; +this.setStream = function (s) { + options.stream = s; +}; +this.reset = function () { + lastContext = null; +}; +this.report = function (data) { + var event = data[1]; + + switch (data[0]) { + case 'vow': + if (['honored', 'pending'].indexOf(event.status) === -1) { + if (lastContext !== event.context) { + lastContext = event.context; + puts(console.contextText(event.context)); + } + puts(console.vowText(event)); + puts(''); + } + break; + case 'error': + puts(console.error(event)); + break; + } +}; +this.print = function (str) {}; diff --git a/node_modules/vows/lib/vows/reporters/xunit.js b/node_modules/vows/lib/vows/reporters/xunit.js new file mode 100644 index 0000000..411a948 --- /dev/null +++ b/node_modules/vows/lib/vows/reporters/xunit.js @@ -0,0 +1,90 @@ +// xunit outoput for vows, so we can run things under hudson +// +// The translation to xunit is simple. Most likely more tags/attributes can be +// added, see: http://ant.1045680.n5.nabble.com/schema-for-junit-xml-output-td1375274.html +// + +var puts = require('util').puts; + +var buffer = [], + curSubject = null; + +function xmlEnc(value) { + return !value ? value : String(value).replace(/&/g, "&") + .replace(/>/g, ">") + .replace(/'; +} + +function cdata(data) { + return ''; +} + +this.name = 'xunit'; +this.report = function (data) { + var event = data[1]; + + switch (data[0]) { + case 'subject': + curSubject = event; + break; + case 'context': + break; + case 'vow': + switch (event.status) { + case 'honored': + buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, true)); + break; + case 'broken': + var err = tag('error', {type: 'vows.event.broken', message: 'Broken test'}, false, cdata(event.exception)); + buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, false, err)); + break; + case 'errored': + var skip = tag('skipped', {type: 'vows.event.errored', message: 'Errored test'}, false, cdata(event.exception)); + buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, false, skip)); + break; + case 'pending': + // nop + break; + } + break; + case 'end': + buffer.push(end('testcase')); + break; + case 'finish': + buffer.unshift(tag('testsuite', {name: 'Vows test', tests: event.total, timestamp: (new Date()).toUTCString(), errors: event.errored, failures: event.broken, skip: event.pending, time: event.time})); + buffer.push(end('testsuite')); + puts(buffer.join('\n')); + break; + case 'error': + break; + } +}; + +this.print = function (str) { }; diff --git a/node_modules/vows/lib/vows/suite.js b/node_modules/vows/lib/vows/suite.js new file mode 100644 index 0000000..e2c2423 --- /dev/null +++ b/node_modules/vows/lib/vows/suite.js @@ -0,0 +1,386 @@ +var events = require('events'), + path = require('path'); + +var vows = require('../vows'); +var Context = require('../vows/context').Context; + +this.Suite = function (subject) { + this.subject = subject; + this.matcher = /.*/; + this.reporter = require('./reporters/dot-matrix'); + this.batches = []; + this.options = { error: true }; + this.reset(); +}; + +this.Suite.prototype = new(function () { + this.reset = function () { + this.results = { + honored: 0, + broken: 0, + errored: 0, + pending: 0, + total: 0, + time: null + }; + this.batches.forEach(function (b) { + b.lastContext = null; + b.remaining = b._remaining; + b.honored = b.broken = b.errored = b.total = b.pending = 0; + b.vows.forEach(function (vow) { vow.status = null }); + b.teardowns = []; + }); + }; + + this.addBatch = function (tests) { + this.batches.push({ + tests: tests, + suite: this, + vows: [], + remaining: 0, + _remaining: 0, + honored: 0, + broken: 0, + errored: 0, + pending: 0, + total: 0, + teardowns: [] + }); + return this; + }; + this.addVows = this.addBatch; + + this.parseBatch = function (batch, matcher) { + var tests = batch.tests; + + if ('topic' in tests) { + throw new(Error)("missing top-level context."); + } + // Count the number of vows/promises expected to fire, + // so we know when the tests are over. + // We match the keys against `matcher`, to decide + // whether or not they should be included in the test. + // Any key, including assertion function keys can be matched. + // If a child matches, then the n parent topics must not be skipped. + (function count(tests, _match) { + var match = false; + + var keys = Object.keys(tests).filter(function (k) { + return k !== 'topic' && k !== 'teardown'; + }); + + for (var i = 0, key; i < keys.length; i++) { + key = keys[i]; + + // If the parent node, or this one matches. + match = _match || matcher.test(key); + + if (typeof(tests[key]) === 'object') { + match = count(tests[key], match); + } else { + if (typeof(tests[key]) === 'string') { + tests[key] = new(String)(tests[key]); + } + if (! match) { + tests[key]._skip = true; + } + } + } + + // If any of the children matched, + // don't skip this node. + for (var i = 0; i < keys.length; i++) { + if (! tests[keys[i]]._skip) { match = true } + } + + if (match) { batch.remaining ++ } + else { tests._skip = true } + + return match; + })(tests, false); + + batch._remaining = batch.remaining; + }; + + this.runBatch = function (batch) { + var topic, + tests = batch.tests, + promise = batch.promise = new(events.EventEmitter); + + var that = this; + + batch.status = 'begin'; + + // The test runner, it calls itself recursively, passing the + // previous context to the inner contexts. This is so the `topic` + // functions have access to all the previous context topics in their + // arguments list. + // It is defined and invoked at the same time. + // If it encounters a `topic` function, it waits for the returned + // promise to emit (the topic), at which point it runs the functions under it, + // passing the topic as an argument. + (function run(ctx, lastTopic) { + var old = false; + topic = ctx.tests.topic; + + if (typeof(topic) === 'function') { + if (ctx.isEvent || ctx.name === 'on') { + throw new Error('Event context cannot contain a topic'); + } + + // Run the topic, passing the previous context topics + // If topic `throw`s an exception, pass it down as a value + try { + topic = topic.apply(ctx.env, ctx.topics); + } + catch (ex) { + topic = ex; + } + + if (typeof(topic) === 'undefined') { ctx._callback = true } + } + + // If this context has a topic, store it in `lastTopic`, + // if not, use the last topic, passed down by a parent + // context. + if (typeof(topic) !== 'undefined' || ctx._callback) { + lastTopic = topic; + } else { + old = true; + topic = lastTopic; + } + + // If the topic doesn't return an event emitter (such as a promise), + // we create it ourselves, and emit the value on the next tick. + if (! (topic && + topic.constructor === events.EventEmitter)) { + // If the context is a traditional vow, then a topic can ONLY + // be an EventEmitter. However if the context is a sub-event + // then the topic may be an instanceof EventEmitter + if (!ctx.isEvent || + (ctx.isEvent && !(topic instanceof events.EventEmitter))) { + + ctx.emitter = new(events.EventEmitter); + + if (! ctx._callback) { + process.nextTick(function (val) { + return function () { + ctx.emitter.emit("success", val) + }; + }(topic)); + } + // if I have a callback, push the new topic back up to + // lastTopic + if (ctx._callback) { + lastTopic = topic = ctx.emitter; + } else { + topic = ctx.emitter; + } + } + } + + topic.on(ctx.event, function (val) { + // Once the topic fires, add the return value + // to the beginning of the topics list, so it + // becomes the first argument for the next topic. + // If we're using the parent topic, no need to + // prepend it to the topics list, or we'll get + // duplicates. + if (!old || ctx.isEvent) { + Array.prototype.unshift.apply(ctx.topics, arguments) + }; + }); + if (topic.setMaxListeners) { topic.setMaxListeners(Infinity) } + // Now run the tests, or sub-contexts + Object.keys(ctx.tests).filter(function (k) { + return ctx.tests[k] && k !== 'topic' && + k !== 'teardown' && !ctx.tests[k]._skip; + }).forEach(function (item) { + // Create a new evaluation context, + // inheriting from the parent one. + var env = Object.create(ctx.env); + env.suite = that; + + // Holds the current test or context + var vow = Object.create({ + callback: ctx.tests[item], + context: ctx.title, + description: item, + binding: ctx.env, + status: null, + batch: batch + }); + + // If we encounter a function, add it to the callbacks + // of the `topic` function, so it'll get called once the + // topic fires. + // If we encounter an object literal, we recurse, sending it + // our current context. + if ((typeof(vow.callback) === 'function') || + (vow.callback instanceof String)) { + topic.addVow(vow); + } else if (typeof(vow.callback) === 'object') { + // If there's a setup stage, we have to wait for it to fire, + // before calling the inner context. + // If the event has already fired, the context is 'on' or + // there is no setup stage, just run the inner context + // synchronously. + if (topic && + ctx.name !== 'on' && + !topic._vowsEmitedEvents.hasOwnProperty(ctx.event)) { + topic.on(ctx.event, function (ctx) { + return function (val) { + return run(new(Context)(vow, ctx, env), lastTopic); + }; + }(ctx)); + } else { + run(new(Context)(vow, ctx, env), lastTopic); + } + } + }); + // Teardown + if (ctx.tests.teardown) { + batch.teardowns.push(ctx); + } + if (! ctx.tests._skip) { + batch.remaining --; + } + // Check if we're done running the tests + exports.tryEnd(batch); + // This is our initial, empty context + })(new(Context)({ callback: tests, context: null, description: null }, {})); + return promise; + }; + + this.report = function () { + return this.reporter.report.apply(this.reporter, arguments); + }; + + this.run = function (options, callback) { + var that = this, start; + + options = options || {}; + + Object.keys(options).forEach(function (k) { + that.options[k] = options[k]; + }); + + this.matcher = this.options.matcher || this.matcher; + this.reporter = this.options.reporter || this.reporter; + + this.batches.forEach(function (batch) { + that.parseBatch(batch, that.matcher); + }); + + this.reset(); + + start = new(Date); + + if (this.batches.filter(function (b) { return b.remaining > 0 }).length) { + this.report(['subject', this.subject]); + } + + return (function run(batches) { + var batch = batches.shift(); + + if (batch) { + // If the batch has no vows to run, + // go to the next one. + if (batch.remaining === 0) { + run(batches); + } else { + that.runBatch(batch).on('end', function () { + run(batches); + }); + } + } else { + that.results.time = (new(Date) - start) / 1000; + that.report(['finish', that.results]); + + if (callback) { callback(that.results) } + + if (that.results.honored + that.results.pending === that.results.total) { + return 0; + } else { + return 1; + } + } + })(this.batches.slice(0)); + }; + + this.runParallel = function () {}; + + this.export = function (module, options) { + var that = this; + + Object.keys(options || {}).forEach(function (k) { + that.options[k] = options[k]; + }); + + if (require.main === module) { + return this.run(); + } else { + return module.exports[this.subject] = this; + } + }; + this.exportTo = function (module, options) { // Alias, for JSLint + return this.export(module, options); + }; +}); + +// +// Checks if all the tests in the batch have been run, +// and triggers the next batch (if any), by emitting the 'end' event. +// +this.tryEnd = function (batch) { + var result, style, time; + + if (batch.honored + batch.broken + batch.errored + batch.pending === batch.total && + batch.remaining === 0) { + + Object.keys(batch).forEach(function (k) { + (k in batch.suite.results) && (batch.suite.results[k] += batch[k]); + }); + + if (batch.teardowns) { + for (var i = batch.teardowns.length - 1, ctx; i >= 0; i--) { + runTeardown(batch.teardowns[i]); + } + + maybeFinish(); + } + + function runTeardown(teardown) { + var env = Object.create(teardown.env); + + Object.defineProperty(env, "callback", { + get: function () { + teardown.awaitingCallback = true; + + return function () { + teardown.awaitingCallback = false; + maybeFinish(); + }; + } + }); + + teardown.tests.teardown.apply(env, teardown.topics); + } + + function maybeFinish() { + var pending = batch.teardowns.filter(function (teardown) { + return teardown.awaitingCallback; + }); + + if (pending.length === 0) { + finish(); + } + } + + function finish() { + batch.status = 'end'; + batch.suite.report(['end']); + batch.promise.emit('end', batch.honored, batch.broken, batch.errored, batch.pending); + } + } +}; diff --git a/node_modules/vows/node_modules/diff/LICENSE b/node_modules/vows/node_modules/diff/LICENSE new file mode 100644 index 0000000..c135dcf --- /dev/null +++ b/node_modules/vows/node_modules/diff/LICENSE @@ -0,0 +1,31 @@ +Software License Agreement (BSD License) + +Copyright (c) 2009-2011, Kevin Decker + +All rights reserved. + +Redistribution and use of this software in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of Kevin Decker nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/node_modules/vows/node_modules/diff/README.md b/node_modules/vows/node_modules/diff/README.md new file mode 100644 index 0000000..2ed7ee1 --- /dev/null +++ b/node_modules/vows/node_modules/diff/README.md @@ -0,0 +1,94 @@ +# jsdiff + +A javascript text differencing implementation. + +Based on the algorithm proposed in +["An O(ND) Difference Algorithm and its Variations" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927). + +## Installation + + npm install diff + +or + + git clone git://github.com/kpdecker/jsdiff.git + +## API + +* JsDiff.diffChars(oldStr, newStr) + Diffs two blocks of text, comparing character by character. + + Returns a list of change objects (See below). + +* JsDiff.diffWords(oldStr, newStr) + Diffs two blocks of text, comparing word by word. + + Returns a list of change objects (See below). + +* JsDiff.diffLines(oldStr, newStr) + Diffs two blocks of text, comparing line by line. + + Returns a list of change objects (See below). + +* JsDiff.diffCss(oldStr, newStr) + Diffs two blocks of text, comparing CSS tokens. + + Returns a list of change objects (See below). + +* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader) + Creates a unified diff patch. + + Parameters: + * fileName : String to be output in the filename sections of the patch + * oldStr : Original string value + * newStr : New string value + * oldHeader : Additional information to include in the old file header + * newHeader : Additional information to include in thew new file header + +* convertChangesToXML(changes) + Converts a list of changes to a serialized XML format + +### Change Objects +Many of the methods above return change objects. These objects are consist of the following fields: + +* value: Text content +* added: True if the value was inserted into the new string +* removed: True of the value was removed from the old string + +Note that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner. + +## [Example](http://kpdecker.github.com/jsdiff) + +## License + +Software License Agreement (BSD License) + +Copyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com + +All rights reserved. + +Redistribution and use of this software in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of Kevin Decker nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/vows/node_modules/diff/diff.js b/node_modules/vows/node_modules/diff/diff.js new file mode 100644 index 0000000..8e6a1c0 --- /dev/null +++ b/node_modules/vows/node_modules/diff/diff.js @@ -0,0 +1,296 @@ +/* See license.txt for terms of usage */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +var JsDiff = (function() { + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, "&"); + n = n.replace(//g, ">"); + n = n.replace(/"/g, """); + + return n; + } + + + var fbDiff = function(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + }; + fbDiff.prototype = { + diff: function(oldString, newString) { + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString == oldString) { + return [{ value: newString }]; + } + if (!newString) { + return [{ value: oldString, removed: true }]; + } + if (!oldString) { + return [{ value: newString, added: true }]; + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0 + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { + return bestPath[0].components; + } + + for (var editLength = 1; editLength <= maxEditLength; editLength++) { + for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { + var basePath; + var addPath = bestPath[diagonalPath-1], + removePath = bestPath[diagonalPath+1]; + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath-1] = undefined; + } + + var canAdd = addPath && addPath.newPos+1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + this.pushComponent(basePath.components, oldString[oldPos], undefined, true); + } else { + basePath = clonePath(addPath); + basePath.newPos++; + this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); + } + + var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); + + if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { + return basePath.components; + } else { + bestPath[diagonalPath] = basePath; + } + } + } + }, + + pushComponent: function(components, value, added, removed) { + var last = components[components.length-1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length-1] = + {value: this.join(last.value, value), added: added, removed: removed }; + } else { + components.push({value: value, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath; + while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { + newPos++; + oldPos++; + + this.pushComponent(basePath.components, newString[newPos], undefined, undefined); + } + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { + return true; + } else { + return left == right; + } + }, + join: function(left, right) { + return left + right; + }, + tokenize: function(value) { + return value; + } + }; + + var CharDiff = new fbDiff(); + + var WordDiff = new fbDiff(true); + WordDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new fbDiff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new fbDiff(); + LineDiff.tokenize = function(value) { + return value.split(/^/m); + }; + + return { + diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, + diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, + diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, + + diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + ret.push("Index: " + fileName); + ret.push("==================================================================="); + ret.push("--- " + fileName + (typeof oldHeader === "undefined" ? "" : "\t" + oldHeader)); + ret.push("+++ " + fileName + (typeof newHeader === "undefined" ? "" : "\t" + newHeader)); + + var diff = LineDiff.diff(oldStr, newStr); + if (!diff[diff.length-1].value) { + diff.pop(); // Remove trailing newline add + } + diff.push({value: "", lines: []}); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function(entry) { return ' ' + entry; }); + } + function eofNL(curRange, i, current) { + var last = diff[diff.length-2], + isLast = i === diff.length-2, + isLastOfType = i === diff.length-3 && (current.added === !last.added || current.removed === !last.removed); + + // Figure out if this is the last line for the given file and missing NL + if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, "").split("\n"); + current.lines = lines; + + if (current.added || current.removed) { + if (!oldRangeStart) { + var prev = diff[i-1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?"+":"-") + entry; })); + eofNL(curRange, i, current); + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length-2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + "@@ -" + oldRangeStart + "," + (oldLine-oldRangeStart+contextSize) + + " +" + newRangeStart + "," + (newLine-newRangeStart+contextSize) + + " @@"); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; newRangeStart = 0; curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + convertChangesToXML: function(changes){ + var ret = []; + for ( var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(""); + } else if (change.removed) { + ret.push(""); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(""); + } else if (change.removed) { + ret.push(""); + } + } + return ret.join(""); + }, + + convertChangesToDMP: function(changes){ + var ret = [], change; + for ( var i = 0; i < changes.length; i++) { + change = changes[i]; + ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); + } + return ret; + } + }; +})(); + +if (typeof module !== "undefined") { + module.exports = JsDiff; +} diff --git a/node_modules/vows/node_modules/diff/index.html b/node_modules/vows/node_modules/diff/index.html new file mode 100644 index 0000000..ecb22fa --- /dev/null +++ b/node_modules/vows/node_modules/diff/index.html @@ -0,0 +1,89 @@ + + + + + Diff + + + + +
+

Diff

+ + + +
+ +github.com/kpdecker/jsdiff + + + + + + + +
restaurantaura
+ + + + + diff --git a/node_modules/vows/node_modules/diff/package.json b/node_modules/vows/node_modules/diff/package.json new file mode 100644 index 0000000..cee7139 --- /dev/null +++ b/node_modules/vows/node_modules/diff/package.json @@ -0,0 +1,42 @@ +{ + "name": "diff", + "version": "1.0.3", + "description": "A javascript text diff implementation.", + "keywords": [ + "diff", + "javascript" + ], + "maintainers": [ + { + "name": "Kevin Decker", + "email": "kpdecker@gmail.com", + "url": "http://incaseofstairs.com" + } + ], + "bugs": { + "email": "kpdecker@gmail.com", + "url": "http://github.com/kpdecker/jsdiff/issues" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/kpdecker/jsdiff/blob/master/LICENSE" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/kpdecker/jsdiff.git" + }, + "engines": { + "node": ">=0.3.1" + }, + "main": "./diff", + "scripts": { + "test": "expresso test/*" + }, + "dependencies": {}, + "devDependencies": {}, + "readme": "# jsdiff\n\nA javascript text differencing implementation.\n\nBased on the algorithm proposed in\n[\"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927).\n\n## Installation\n\n npm install diff\n\nor\n\n git clone git://github.com/kpdecker/jsdiff.git\n\n## API\n\n* JsDiff.diffChars(oldStr, newStr)\n Diffs two blocks of text, comparing character by character.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffWords(oldStr, newStr)\n Diffs two blocks of text, comparing word by word.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffLines(oldStr, newStr)\n Diffs two blocks of text, comparing line by line.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffCss(oldStr, newStr)\n Diffs two blocks of text, comparing CSS tokens.\n\n Returns a list of change objects (See below).\n\n* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader)\n Creates a unified diff patch.\n\n Parameters:\n * fileName : String to be output in the filename sections of the patch\n * oldStr : Original string value\n * newStr : New string value\n * oldHeader : Additional information to include in the old file header\n * newHeader : Additional information to include in thew new file header\n\n* convertChangesToXML(changes)\n Converts a list of changes to a serialized XML format\n\n### Change Objects\nMany of the methods above return change objects. These objects are consist of the following fields:\n\n* value: Text content\n* added: True if the value was inserted into the new string\n* removed: True of the value was removed from the old string\n\nNote that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner.\n\n## [Example](http://kpdecker.github.com/jsdiff)\n\n## License\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n copyright notice, this list of conditions and the\n following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the\n following disclaimer in the documentation and/or other\n materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n contributors may be used to endorse or promote products\n derived from this software without specific prior\n written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n", + "_id": "diff@1.0.3", + "_from": "diff@~1.0.3" +} diff --git a/node_modules/vows/node_modules/diff/style.css b/node_modules/vows/node_modules/diff/style.css new file mode 100644 index 0000000..2047e2d --- /dev/null +++ b/node_modules/vows/node_modules/diff/style.css @@ -0,0 +1,81 @@ +* { + margin: 0; + padding: 0; +} +html, body { + background: #EEE; + font: 12px sans-serif; +} +body { + padding-top: 1.8em; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html, body, table, tbody, tr, td { + height: 100% +} +table { + table-layout: fixed; + width: 100%; +} +td { + width: 33%; + padding: 3px 4px; + border: 1px solid transparent; + vertical-align: top; + font: 1em monospace; + text-align: left; + white-space: pre-wrap; +} +h1 { + display: inline; + font-size: 100%; +} +del { + text-decoration: none; + color: #b30000; + background: #fadad7; +} +ins { + background: #eaf2c2; + color: #406619; + text-decoration: none; +} + +#settings { + position: absolute; + top: 0; + left: 5px; + right: 5px; + height: 2em; + line-height: 2em; +} +#settings label { + margin-left: 1em; +} + +.source { + position: absolute; + right: 1%; + top: .2em; +} + +[contentEditable] { + background: #F9F9F9; + border-color: #BBB #D9D9D9 #DDD; + border-radius: 4px; + -webkit-user-modify: read-write-plaintext-only; + outline: none; +} +[contentEditable]:focus { + background: #FFF; + border-color: #6699cc; + box-shadow: 0 0 4px #2175c9; +} + +@-moz-document url-prefix() { + body { + height: 99%; /* Hide scroll bar in Firefox */ + } +} diff --git a/node_modules/vows/node_modules/diff/test/diffTest.js b/node_modules/vows/node_modules/diff/test/diffTest.js new file mode 100644 index 0000000..62d915d --- /dev/null +++ b/node_modules/vows/node_modules/diff/test/diffTest.js @@ -0,0 +1,625 @@ +const VERBOSE = false; + +var assert = require('assert'), + diff = require('../diff'); + +function log() { + VERBOSE && console.log.apply(console, arguments); +} + +exports['Whitespace diff'] = function() { + diffResult = diff.diffWords("New Value", "New ValueMoreData"); + assert.equal( + "New ValueMoreDataValue", + diff.convertChangesToXML(diffResult), + "Single whitespace diffResult Value"); + + diffResult = diff.diffWords("New Value ", "New ValueMoreData "); + assert.equal( + "New ValueMoreDataValue ", + diff.convertChangesToXML(diffResult), + "Multiple whitespace diffResult Value"); +}; + +// Diff on word boundary +exports['Word Diff'] = function() { + diffResult = diff.diffWords("New :Value:Test", "New ValueMoreData "); + assert.equal( + "New ValueMoreData :Value:Test", + diff.convertChangesToXML(diffResult), + "Nonmatching word boundary diffResult Value"); + diffResult = diff.diffWords("New Value:Test", "New Value:MoreData "); + assert.equal( + "New Value:MoreData Test", + diff.convertChangesToXML(diffResult), + "Word boundary diffResult Value"); + diffResult = diff.diffWords("New Value-Test", "New Value:MoreData "); + assert.equal( + "New Value:MoreData -Test", + diff.convertChangesToXML(diffResult), + "Uninque boundary diffResult Value"); + diffResult = diff.diffWords("New Value", "New Value:MoreData "); + assert.equal( + "New Value:MoreData ", + diff.convertChangesToXML(diffResult), + "Word boundary diffResult Value"); +}; + +// Diff without changes +exports['Diff without changes'] = function() { + diffResult = diff.diffWords("New Value", "New Value"); + assert.equal( + "New Value", + diff.convertChangesToXML(diffResult), + "No changes diffResult Value"); + diffResult = diff.diffWords("New Value", "New Value"); + assert.equal( + "New Value", + diff.convertChangesToXML(diffResult), + "No changes whitespace diffResult Value"); + diffResult = diff.diffWords("", ""); + assert.equal( + "", + diff.convertChangesToXML(diffResult), + "Empty no changes diffResult Value"); +}; + +// Empty diffs +exports['Empty diffs'] = function() { + diffResult = diff.diffWords("New Value", ""); + assert.equal(1, diffResult.length, "Empty diff result length"); + assert.equal( + "New Value", + diff.convertChangesToXML(diffResult), + "Empty diffResult Value"); + diffResult = diff.diffWords("", "New Value"); + assert.equal( + "New Value", + diff.convertChangesToXML(diffResult), + "Empty diffResult Value"); +}; + +// With without anchor (the Heckel algorithm error case) +exports['No anchor'] = function() { + diffResult = diff.diffWords("New Value New Value", "Value Value New New"); + assert.eql( + "ValueNew Value New NewValue", + diff.convertChangesToXML(diffResult), + "No anchor diffResult Value"); +}; + +// CSS Diff +exports['CSS diffs'] = function() { + diffResult = diff.diffCss( + ".test,#value .test{margin-left:50px;margin-right:-40px}", + ".test2, #value2 .test {\nmargin-top:50px;\nmargin-right:-400px;\n}"); + assert.equal( + ".test2.test,#value #value2 .test {\n" + + "margin-topmargin-left:50px;\n" + + "margin-right:-400px;\n-40px}", + diff.convertChangesToXML(diffResult), + "CSS diffResult Value"); +}; + +// Line Diff +exports['Line diffs'] = function() { + diffResult = diff.diffLines( + "line\nold value\nline", + "line\nnew value\nline"); + assert.equal( + "line\nnew value\nold value\nline", + diff.convertChangesToXML(diffResult), + "Line diffResult Value"); + diffResult = diff.diffLines( + "line\nvalue\nline", + "line\nvalue\nline"); + assert.equal( + "line\nvalue\nline", + diff.convertChangesToXML(diffResult), + "Line same diffResult Value"); + diffResult = diff.diffLines( + "line\nvalue \nline", + "line\nvalue\nline"); + log("diffResult", diffResult); + log("diffResult", diff.convertChangesToXML(diffResult)); + assert.equal( + "line\nvalue\nvalue \nline", + diff.convertChangesToXML(diffResult), + "Line whitespace diffResult Value"); +}; + +// Patch creation with diff at EOF +exports['lastLineChanged'] = function() { + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,3 +1,4 @@\n' + + ' line2\n' + + ' line3\n' + + '+line4\n' + + ' line5\n', + diff.createPatch('test', 'line2\nline3\nline5\n', 'line2\nline3\nline4\nline5\n', 'header1', 'header2')); + + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,3 +1,4 @@\n' + + ' line2\n' + + ' line3\n' + + ' line4\n' + + '+line5\n', + diff.createPatch('test', 'line2\nline3\nline4\n', 'line2\nline3\nline4\nline5\n', 'header1', 'header2')); + + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,4 +1,4 @@\n' + + ' line1\n' + + ' line2\n' + + ' line3\n' + + '+line44\n' + + '-line4\n', + diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline44\n', 'header1', 'header2')); + + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,4 +1,5 @@\n' + + ' line1\n' + + ' line2\n' + + ' line3\n' + + '+line44\n' + + '+line5\n' + + '-line4\n', + diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline44\nline5\n', 'header1', 'header2')); +}; + +exports['EOFNL'] = function() { + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,4 +1,4 @@\n' + + ' line1\n' + + ' line2\n' + + ' line3\n' + + '+line4\n' + + '\\ No newline at end of file\n' + + '-line4\n', + diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline4', 'header1', 'header2')); + + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,4 +1,4 @@\n' + + ' line1\n' + + ' line2\n' + + ' line3\n' + + '+line4\n' + + '-line4\n' + + '\\ No newline at end of file\n', + diff.createPatch('test', 'line1\nline2\nline3\nline4', 'line1\nline2\nline3\nline4\n', 'header1', 'header2')); + + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,4 +1,4 @@\n' + + '+line1\n' + + '-line11\n' + + ' line2\n' + + ' line3\n' + + ' line4\n' + + '\\ No newline at end of file\n', + diff.createPatch('test', 'line11\nline2\nline3\nline4', 'line1\nline2\nline3\nline4', 'header1', 'header2')); + + assert.eql( + 'Index: test\n' + + '===================================================================\n' + + '--- test\theader1\n' + + '+++ test\theader2\n' + + '@@ -1,5 +1,5 @@\n' + + '+line1\n' + + '-line11\n' + + ' line2\n' + + ' line3\n' + + ' line4\n' + + ' line4\n', + diff.createPatch('test', 'line11\nline2\nline3\nline4\nline4\nline4\nline4', 'line1\nline2\nline3\nline4\nline4\nline4\nline4', 'header1', 'header2')); +}; + +exports['Large Test'] = function() { + var random = 42; + var mult = 134775813, range = Math.pow(2, 32); + function nextRandom() { + random = ((random * mult) + 1) % range; + return random; + } + var largeTest = ".hbh9asgiidc {ehaahc9:ses;bhg9hc:ses;idgaag-hi9aa:cdca;ihgd9gdgca-gdadg:ighchehgaci;ggghdg:edhciag;daagsada:ahhhiaa;ahai7:hgid;}.hbh9asgiidc.hchgihaa {ggghdg:hgid;}.igiidchbh9ah {ihgd9gdgca-hbh9a:gga(" + + "hbh9ah/igiidcfhbh9ah.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7des;bhg9hc-gh97i:ses;ahai7:7des;ihgd9gdgca-edhhihdc:ses ses;}.igiidcfgde9 {ihgd9gdgca-edhhihdc:ses ses;}.bdghadaag .igiidcfgde9 {ihgd9gdgc" + + "a-edhhihdc:-7des ses;}.hchgihaa .igiidcfgde9 {ihgd9gdgca-edhhihdc:-dses ses;}.igiidcfaaaaia {ihgd9gdgca-edhhihdc:-bdes ses;}.bdghadaag .igiidcfaaaaia {ihgd9gdgca-edhhihdc:-9sses ses;}.hchgihaa .igiidc" + + "faaaaia {ihgd9gdgca-edhhihdc:-97des ses;}.igiidcfadacadha {ihgd9gdgca-edhhihdc:-9dses ses;}.bdghadaag .igiidcfadacadha {ihgd9gdgca-edhhihdc:-9bdes ses;}.hchgihaa .igiidcfadacadha {ihgd9gdgca-edhhihdc:" + + "-7sses ses;}.igiidcfabhha {ihgd9gdgca-edhhihdc:-77des ses;}.bdghadaag .igiidcfabhha {ihgd9gdgca-edhhihdc:-7dses ses;}.hchgihaa .igiidcfabhha {ihgd9gdgca-edhhihdc:-7bdes ses;}.igiidcfbdaa {ihgd9gdgca-e" + + "dhhihdc:-d7des ses;}.bdghadaag .igiidcfbdaa {ihgd9gdgca-edhhihdc:-ddses ses;}.hchgihaa .igiidcfbdaa {ihgd9gdgca-edhhihdc:-dbdes ses;}.igiidcfcaasdaaag {ihgd9gdgca-edhhihdc:-abdes ses;}.bdghadaag .igii" + + "dcfcaasdaaag {ihgd9gdgca-edhhihdc:-bsses ses;}.hchgihaa .igiidcfcaasdaaag {ihgd9gdgca-edhhihdc:-b7des ses;}.igiidcfgachba {ihgd9gdgca-edhhihdc:-dbdes ses;}.bdghadaag .igiidcfgachba {ihgd9gdgca-edhhihd" + + "c:-9ssses ses;}.hchgihaa .igiidcfgachba {ihgd9gdgca-edhhihdc:-9s7des ses;}.igiidcfghh {ihgd9gdgca-edhhihdc:-9sdses ses;}.bdghadaag .igiidcfghh {ihgd9gdgca-edhhihdc:-9sbdes ses;}.hchgihaa .igiidcfghh {" + + "ihgd9gdgca-edhhihdc:-99sses ses;}.igiidcfh7hga {ihgd9gdgca-edhhihdc:-97bdes ses;}.bdghadaag .igiidcfh7hga {ihgd9gdgca-edhhihdc:-9hsses ses;}.hchgihaa .igiidcfh7hga {ihgd9gdgca-edhhihdc:-9h7des ses;}.i" + + "giidcfgeadha {ihgd9gdgca-edhhihdc:-9hdses ses;}.bdghadaag .igiidcfgeadha {ihgd9gdgca-edhhihdc:-9hbdes ses;}.hchgihaa .igiidcfgeadha {ihgd9gdgca-edhhihdc:-9gsses ses;}.igiidcfaaisdaaag {ihgd9gdgca-edhh" + + "ihdc:-9dsses ses;}.bdghadaag .igiidcfaaisdaaag {ihgd9gdgca-edhhihdc:-9d7des ses;}.hchgihaa .igiidcfaaisdaaag {ihgd9gdgca-edhhihdc:-9ddses ses;}.igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-hsses ses;}.bdgh" + + "adaag .igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-h7des ses;}.hchgihaa .igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-hdses ses;}.igiidcfadgd {ihgd9gdgca-edhhihdc:-hbdes ses;}.bdghadaag .igiidcfadgd {ihgd9gdgc" + + "a-edhhihdc:-gsses ses;}.hchgihaa .igiidcfadgd {ihgd9gdgca-edhhihdc:-g7des ses;}.igiidcfbhch9a {ihgd9gdgca-edhhihdc:-gdses ses;}.bdghadaag .igiidcfbhch9a {ihgd9gdgca-edhhihdc:-gbdes ses;}.hchgihaa .igi" + + "idcfbhch9a {ihgd9gdgca-edhhihdc:-dsses ses;}.igiidcfcaaahdh {ihgd9gdgca-edhhihdc:-bdses ses;}.bdghadaag .igiidcfcaaahdh {ihgd9gdgca-edhhihdc:-bbdes ses;}.hchgihaa .igiidcfcaaahdh {ihgd9gdgca-edhhihdc:" + + "-csses ses;}.igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:-97sses ses;}.bdghadaag .igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:-977des ses;}.hchgihaa .igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:" + + "-97dses ses;}.igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-997des ses;}.bdghadaag .igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-99dses ses;}.hchgihaa .igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-99bdes ses;}.igiidc" + + "fcaaidddbhgd {ihgd9gdgca-edhhihdc:-asses ses;}.bdghadaag .igiidcfcaaidddbhgd {ihgd9gdgca-edhhihdc:-a7des ses;}.hchgihaa .igiidcfcaaidddbhgd {ihgd9gdgca-edhhihdc:-adses ses;}.igiidcfdeac {ihgd9gdgca-ed" + + "hhihdc:-c7des ses;}.bdghadaag .igiidcfdeac {ihgd9gdgca-edhhihdc:-cdses ses;}.hchgihaa .igiidcfdeac {ihgd9gdgca-edhhihdc:-cbdes ses;}.igiidcfdaagaghia {ihgd9gdgca-edhhihdc:-9hdses ses;}.bdghadaag .igii" + + "dcfdaagaghia {ihgd9gdgca-edhhihdc:-9hbdes ses;}.hchgihaa .igiidcfdaagaghia {ihgd9gdgca-edhhihdc:-9gsses ses;}.igiidcfahaa {ihgd9gdgca-edhhihdc:-9g7des ses;}.bdghadaag .igiidcfahaa {ihgd9gdgca-edhhihdc" + + ":-9gdses ses;}.hchgihaa .igiidcfahaa {ihgd9gdgca-edhhihdc:-9gbdes ses;}.igiidcfih9 {ihgd9gdgca-edhhihdc:-9dbdes ses;}.bdghadaag .igiidcfih9 {ihgd9gdgca-edhhihdc:-9asses ses;}.hchgihaa .igiidcfih9 {ihg" + + "d9gdgca-edhhihdc:-9a7des ses;}.igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9b7des ses;}.bdghadaag .igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9bdses ses;}.hchgihaa .igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9bbde" + + "s ses;}.igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9csses ses;}.bdghadaag .igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9c7des ses;}.hchgihaa .igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9cdses ses;}.igiidcfggahiaha" + + "ghah {ihgd9gdgca-edhhihdc:-9csses ses;}.bdghadaag .igiidcfggahiahaghah {ihgd9gdgca-edhhihdc:-9c7des ses;}.hchgihaa .igiidcfggahiahaghah {ihgd9gdgca-edhhihdc:-9cdses ses;}.igiidcfggahiagagdgaghia9dg9 {" + + "ihgd9gdgca-edhhihdc:-9cbdes ses;}.bdghadaag .igiidcfggahiagagdgaghia9dg9 {ihgd9gdgca-edhhihdc:-9dsses ses;}.hchgihaa .igiidcfggahiagagdgaghia9dg9 {ihgd9gdgca-edhhihdc:-9d7des ses;}.igiidcfggahiagagdga" + + "sdaaag {ihgd9gdgca-edhhihdc:-9ddses ses;}.bdghadaag .igiidcfggahiagagdgasdaaag {ihgd9gdgca-edhhihdc:-9dbdes ses;}.hchgihaa .igiidcfggahiagagdgasdaaag {ihgd9gdgca-edhhihdc:-7ssses ses;}.igiidcfggahiaga" + + "gdga {ihgd9gdgca-edhhihdc:-7s7des ses;}.bdghadaag .igiidcfggahiagagdga {ihgd9gdgca-edhhihdc:-7sdses ses;}.hchgihaa .igiidcfggahiagagdga {ihgd9gdgca-edhhihdc:-7sbdes ses;}.igiidcfggahiae79hhghagagdga {" + + "ihgd9gdgca-edhhihdc:-79bdes ses;}.bdghadaag .igiidcfggahiae79hhghagagdga {ihgd9gdgca-edhhihdc:-77sses ses;}.hchgihaa .igiidcfggahiae79hhghagagdga {ihgd9gdgca-edhhihdc:-777des ses;}.igiidcfbhdagagdga {" + + "ihgd9gdgca-edhhihdc:-77dses ses;}.bdghadaag .igiidcfbhdagagdga {ihgd9gdgca-edhhihdc:-77bdes ses;}.hchgihaa .igiidcfbhdagagdga {ihgd9gdgca-edhhihdc:-7hsses ses;}.igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-" + + "edhhihdc:-79sses ses;}.bdghadaag .igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-edhhihdc:-797des ses;}.hchgihaa .igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-edhhihdc:-79dses ses;}.igiidcfgaea9abhha {ihgd9gdgca-ed" + + "hhihdc:-7h7des ses;}.bdghadaag .igiidcfgaea9abhha {ihgd9gdgca-edhhihdc:-7hdses ses;}.hchgihaa .igiidcfgaea9abhha {ihgd9gdgca-edhhihdc:-7hbdes ses;}.igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9b7des ses" + + ";}.bdghadaag .igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9bdses ses;}.hchgihaa .igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9bbdes ses;}.igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7d7des ses;}.bdghadaag ." + + "igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7ddses ses;}.hchgihaa .igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7dbdes ses;}.igiidcfhhaa {ihgd9gdgca-edhhihdc:-7a7des ses;}.bdghadaag .igiidcfhhaa {ihgd9gdgc" + + "a-edhhihdc:-7adses ses;}.hchgihaa .igiidcfhhaa {ihgd9gdgca-edhhihdc:-7abdes ses;}.igiidcfhhaa {ihgd9gdgca-edhhihdc:-7a7des ses;}.bdghadaag .igiidcfhhaa {ihgd9gdgca-edhhihdc:-7adses ses;}.hchgihaa .igi" + + "idcfhhaa {ihgd9gdgca-edhhihdc:-7abdes ses;}.igiidcfaahi {ihgd9gdgca-edhhihdc:-h9shes ses;}.bdghadaag .igiidcfaahi {ihgd9gdgca-edhhihdc:-h97ces ses;}.hchgihaa .igiidcfaahi {ihgd9gdgca-edhhihdc:-h9dhes " + + "ses;}.igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h9bces ses;}.bdghadaag .igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h7shes ses;}.hchgihaa .igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h77ces ses;}.igiidcfcaagdcihgi {ihgd" + + "9gdgca-edhhihdc:-h7dhes ses;}.bdghadaag .igiidcfcaagdcihgi {ihgd9gdgca-edhhihdc:-h7bces ses;}.hchgihaa .igiidcfcaagdcihgi {ihgd9gdgca-edhhihdc:-hhshes ses;}.igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hh7ce" + + "s ses;}.bdghadaag .igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hhdhes ses;}.hchgihaa .igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hhbces ses;}.igiidcf7aae {ihgd9gdgca-edhhihdc:-hgshes ses;}.bdghadaag .igiidcf7aae" + + " {ihgd9gdgca-edhhihdc:-hg7ces ses;}.igiidcfagdebacg {ihgd9gdgca-edhhihdc:-hscces ses;ahai7:9ges;}.bdghadaag .igiidcfagdebacg {ihgd9gdgca-edhhihdc:-hsbges ses;}.hchgihaa .igiidcfagdebacg {ihgd9gdgca-ed" + + "hhihdc:-hscces ses;}.igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7bbdes ses;}.bdghadaag .igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7csses ses;}.hchgihaa .igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7c7des ses;}" + + ".igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hgdhes ses;}.bdghadaag .igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hgbces ses;}.hchgihaa .igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hdshes ses;}.igiidcfgas" + + "gah7 {ihgd9gdgca-edhhihdc:-hd7ces ses;}.bdghadaag .igiidcfgasgah7 {ihgd9gdgca-edhhihdc:-hddhes ses;}.hchgihaa .igiidcfgasgah7 {ihgd9gdgca-edhhihdc:-hdbces ses;}.igiidcfgadhaagdeids {ihgd9gdgca-edhhihd" + + "c:-hashes ses;}.bdghadaag .igiidcfgadhaagdeids {ihgd9gdgca-edhhihdc:-ha7ces ses;}.hchgihaa .igiidcfgadhaagdeids {ihgd9gdgca-edhhihdc:-hadhes ses;}.igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-habces ses;}" + + ".bdghadaag .igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-hbshes ses;}.hchgihaa .igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-hb7ces ses;}.igiidcfcaaagdeids {ihgd9gdgca-edhhihdc:-hbdges ses;}.bdghadaag .igiidc" + + "fcaaagdeids {ihgd9gdgca-edhhihdc:-hbbdes ses;}.hchgihaa .igiidcfcaaagdeids {ihgd9gdgca-edhhihdc:-hcsges ses;}.igiidcfighh7gahidga {ihgd9gdgca-edhhihdc:-hc7des ses;}.bdghadaag .igiidcfighh7gahidga {ihg" + + "d9gdgca-edhhihdc:-hcdges ses;}.hchgihaa .igiidcfighh7gahidga {ihgd9gdgca-edhhihdc:-hcbdes ses;}.hgdchbh9ah {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdcfhbh9ah.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:77es;ahca-7a" + + "h97i:77es;bhg9hc-gh97i:ses;ahai7:7des;ihgd9gdgca-edhhihdc:ses ses;}.hgdcfidddbhgdggggaci {ihgd9gdgca-edhhihdc:-ses ses;}.hgdcfidddbhgdggggacif7daag {ihgd9gdgca-edhhihdc:-7des ses;}.hgdcfidddbhgdggggac" + + "ifhchgihaa {ihgd9gdgca-edhhihdc:-dses ses;}.hgdcfasehca {ihgd9gdgca-edhhihdc:-bdes ses;}.hgdcfasehcaf7daag {ihgd9gdgca-edhhihdc:-9sses ses;}.hgdcfbhch9aggggaci {ihgd9gdgca-edhhihdc:-97des ses;}.hgdcfb" + + "hch9aggggacif7daag {ihgd9gdgca-edhhihdc:-9dses ses;}.hgdcfbhch9aggggacifhchgihaa {ihgd9gdgca-edhhihdc:-9bges ses;}.hgdcfgasgah7ggggaci {ihgd9gdgca-edhhihdc:-7sses ses;}.hgdcfgasgah7ggggacifhchgihaa {i" + + "hgd9gdgca-edhhihdc:-ah9es ses;}.hgdcfgasgah7ggggacif7daag {ihgd9gdgca-edhhihdc:-77des ses;}.hgdcfidddbhgdh {ahai7:7ses;ihgd9gdgca-edhhihdc:-7dses ses;}.hgdcfidddbhgdhf7daag {ahai7:7ses;ihgd9gdgca-edhh" + + "ihdc:-7bses ses;}.hgdcfge {ahai7:7ses;ihgd9gdgca-edhhihdc:-7cdes ses;}.hgdcfgef7daag {ahai7:7ses;ihgd9gdgca-edhhihdc:-hsdes ses;}.hgdcfgefhchgihaa {ahai7:7ses;ihgd9gdgca-edhhihdc:-h7des ses;}.hgdcfhah" + + "gg7 {ihgd9gdgca-edhhihdc:-hgdes ses;}.hgdcfhahgg7fhchgihaa {ihgd9gdgca-edhhihdc:-asaes ses;}.hgdcfhahgg7f7daag {ihgd9gdgca-edhhihdc:-hbges ses;}.hgdcfgdaaheha {ihgd9gdgca-edhhihdc:-gaaes ses;}.hgdcfgd" + + "aahehaf7daag {ihgd9gdgca-edhhihdc:-gd9es ses;}.hgdcfaggdg {ihgd9gdgca-edhhihdc:-g9hes ses;7ah97i:9ges;}.hgdcf7aae {ihgd9gdgca-edhhihdc:-gh9es ses;7ah97i:9ces;}.hgdcfhcsd {ihgd9gdgca-edhhihdc:-ggdes se" + + "s;7ah97i:9ges;}.hgdcfgddisdaaag {ihgd9gdgca-edhhihdc:-gades ses;7ah97i:7ses;}.hgdcfihgd {ihgd9gdgca-edhhihdc:-d9aes ses;ahai7 :7ses;}.hgdcfihgdf7daag {ihgd9gdgca-edhhihdc:-dhaes ses;ahai7 :7ses;}.hgdc" + + "fgadhafhahgg7 {ihgd9gdgca-edhhihdc:-ddaes ses;ahai7 :7des;}.hgdcfgadhafhahgg7f7daag {ihgd9gdgca-edhhihdc:-dc9es ses;ahai7:7des;}.gbhgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdchfaf.9hs);ihgd9gdgca-gaeahi:cd-" + + "gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa;ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.haghah {ihgd9gdgca-edhhihdc:-ses ses;}.gagfghia9dg9 {ihgd9gdgca-edhhihdc:-7ses ses;}.gagfsdaaag {ihgd" + + "9gdgca-edhhihdc:-gses ses;}.gagfsdaaagfhahhifsa {ihgd9gdgca-edhhihdc:-9gses ses;}.gagfsdaaagfahhedhaa {ihgd9gdgca-edhhihdc:-9ases ses;}.gagfsdaaagfsgd7ac {ihgd9gdgca-edhhihdc:-97ses ses;}.gagdgafe79hh" + + "gha {ihgd9gdgca-edhhihdc:-9sses ses;}.gagdgafabhha {ihgd9gdgca-edhhihdc:-cses ses;}.gagdga {ihgd9gdgca-edhhihdc:-ases ses;}.gagdgafhahhifsa {ihgd9gdgca-edhhihdc:-7sses ses;}.gagdgafahhedhaa {ihgd9gdgc" + + "a-edhhihdc:-77ses ses;}.gagdgafsgd7ac {ihgd9gdgca-edhhihdc:-9cses ses;}.gbhgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdchfaf.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa" + + ";ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.haghah {ihgd9gdgca-edhhihdc:-ses ses;}.gagfghia9dg9 {ihgd9gdgca-edhhihdc:-7ses ses;}.gagfsdaaag {ihgd9gdgca-edhhihdc:-gses ses;}.gagfsdaaagfhahhifsa {ihgd9gdg" + + "ca-edhhihdc:-9gses ses;}.gagfsdaaagfahhedhaa {ihgd9gdgca-edhhihdc:-9ases ses;}.gagfsdaaagfsgd7ac {ihgd9gdgca-edhhihdc:-97ses ses;}.gagdgafe79hhgha {ihgd9gdgca-edhhihdc:-9sses ses;}.gagdgafabhha {ihgd9" + + "gdgca-edhhihdc:-cses ses;}.gagdga {ihgd9gdgca-edhhihdc:-ases ses;}.gagdgafhahhifsa {ihgd9gdgca-edhhihdc:-7sses ses;}.gagdgafahhedhaa {ihgd9gdgca-edhhihdc:-77ses ses;}.gagdgafsgd7ac {ihgd9gdgca-edhhihd" + + "c:-9cses ses;}.shaahgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/gdcghiachihdc.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa;ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.shaa{ihg" + + "d9gdgca-edhhihdc:ses ses;}.shaafhggdihi{ihgd9gdgca-edhhihdc:-7ses ses;}.shaafheeaa{ihgd9gdgca-edhhihdc:-gses ses;}.shaafheeahghihdc{ihgd9gdgca-edhhihdc:-ases ses;}.shaafhgahd{ihgd9gdgca-edhhihdc:-cses" + + " ses;}.shaafasgaa{ihgd9gdgca-edhhihdc:-9sses ses;}.shaaf7iba{ihgd9gdgca-edhhihdc:-97ses ses;}.shaafhbh9a{ihgd9gdgca-edhhihdc:-9gses ses;}.shaafghah{ihgd9gdgca-edhhihdc:-9ases ses;}.shaafghahhgghei{ihg" + + "d9gdgca-edhhihdc:-9cses ses;}.shaafbhadga{ihgd9gdgca-edhhihdc:-7sses ses;}.shaafeei{ihgd9gdgca-edhhihdc:-77ses ses;}.shaafegdgagi{ihgd9gdgca-edhhihdc:-7gses ses;}.shaaffghgdihba{ihgd9gdgca-edhhihdc:-7" + + "ases ses;}.shaafiasi{ihgd9gdgca-edhhihdc:-7cses ses;}.shaafahaad{ihgd9gdgca-edhhihdc:-hsses ses;}.ahdh{ihgd9gdgca-edhhihdc:-hcses ses;}.shaafsba{ihgd9gdgca-edhhihdc:-h7ses ses;}.shaaf7he{ihgd9gdgca-ed" + + "hhihdc:-hgses ses;}.sdaaag{ihgd9gdgca-edhhihdc:-hases ses;}.shaafagdeids {ihgd9gdgca-edhhihdc:-gsses ses;}.aaaaiafhbhaa{ihgd9gdgca-edhhihdc:-ggses ses;ggghdg:edhciag;}.egiahgfh7hga{ihgd9gdgca-edhhihdc" + + ":-gases ses;}.h7hga{ihgd9gdgca-edhhihdc:-gcses ses;}.eghahia{ihgd9gdgca-edhhihdc:-dsses ses;}.gddisdaaag{ihgd9gdgca-edhhihdc:-dcses ses;}.adacfhggda{ihgd9gdgca-edhhihdc:-a77es ses;ahai7:9ces;}.7aae{ih" + + "gd9gdgca-edhhihdc:-agses ses;}.ighh7 {ihgd9gdgca-edhhihdc:-acses ses;}.hggdafgh97i {ihgd9gdgca-edhhihdc:-bs7es ses;ahai7:9ces;}.igahagggbih {a7hia-hehga:cdaghe;}.igahagggbih .igahagggbihfgddi {aagihgh" + + "a-hah9c:bhaaaa;ehaahc9:s;}.igahagggbih .igahagggbihfhggda {aagihgha-hah9c:bhaaaa;ehaahc9-aasi:7es;}.igahagggbih .igahagggbihfahgchba {aagihgha-hah9c:bhaaaa;ehaahc9-aasi:7es;sdci-shbha9:aghha,aaaaaihgh" + + ",hhch-haghs;sdci-hh7a:9ab;}.igahagggbih .igahagggbihfahgchba hcegi {ihgd9gdgca:ighchehgaci;idgaag:cdca;ehaahc9:ses;bhg9hc:ses;ahai7:9ss%;}a {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;}a:ahcd {iasi" + + "-aagdghihdc:cdca;gdadg:#ssssss;}a:ahhhiaa {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:hgihaa {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:ahcd.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:ahhhiaa.i" + + "ddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:hgihaa.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:7daag.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ggbggg;ggghdg:edhc" + + "iag;}a:ahcd.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-hh7a:dd%;}a:ahhhiaa.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-hh7a:dd%;}a:hgihaa.aaaaa9fiasi {iasi-aagdghihdc:gcaagahca;gdad" + + "g:#ssssss;sdci-hh7a:dd%;}a:7daag.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#ggbggg;sdci-hh7a:dd%;ggghdg:edhciag;}a:ahcd.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-aah97i:idaa;sdci-hh" + + "7a:dd%;}a:ahhhiaa.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-aah97i:idaa;sdci-hh7a:dd%;}a:hgihaa.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;sdci-aah97i:idaa;sdc" + + "i-hh7a:dd%;}a:7daag.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#ggbggg;sdci-hh7a:dd%;sdci-aah97i:idaa;ggghdg:edhciag;}a:ahcd.aaaaa7fiasi {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;}a:ahhhiaa.aaaaa7fia" + + "si {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;}a:hgihaa.aaaaa7fiasi {iasi-aagdghihdc:gcaagahca;gdadg:#cdcdcd;}a:7daag.aaaaa7fiasi {iasi-aagdghihdc:gcaagahca;gdadg:#ggbggg;ggghdg:edhciag;}a:ahcd.aaaaahfiasi {" + + "iasi-aagdghihdc:cdca;gdadg:#cdcdcd;ahca-7ah97i:7ses;}a:ahhhiaa.aaaaahfiasi {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;ahca-7ah97i:7ses;}a:hgihaa.aaaaahfiasi {iasi-aagdghihdc:gcaagahca;gdadg:#cdcdcd;ahca-7ah9" + + "7i:7ses;}a:7daag.aaaaahfiasi {iasi-aagdghihdc:cdca;gdadg:#ggbggg;ggghdg:edhciag;ahca-7ah97i:7ses;}a:ahcd.gcaagahca {gdadg:#ssssss;iasi-aagdghihdc:gcaagahca;ggghdg:edhciag;}a:ahhhiaa.gcaagahca {gdadg:#" + + "ssssss;iasi-aagdghihdc:gcaagahca;}a:hgihaa.gcaagahca {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;}a:7daag.gcaagahca {iasi-aagdghihdc:gcaagahca;gdadg:#ggbggg;}.igahagggbih hcegi {ggghdg:edhciag;}.igahaggg" + + "bih hcegi:7daag.hchgihaa {ggghdg:aashgai;gdadg:#adadad;}a:7daag,a.sdggh,a:ahcd.sdggh,a:ahhhiaa.sdggh,a:7daag.sdggh,a:hgihaa.sdggh,.ihiehhi igiidc:7daag,.igahagggbih hcegi:7daag {iasi-aagdghihdc:cdca;g" + + "dadg:#ggbggg;ggghdg:edhciag;}h hb9 {idgaag:cdca;}ida9 {ehaahc9-gh97i:ses;ehaahc9-aasi:ses;ehaahc9-idiidb:ses;ehaahc9-ide:ses;bhg9hc-gh97i:ses;bhg9hc-aasi:ses;bhg9hc-ide:ses;bhg9hc-idiidb:ses;ihgd9gdgc" + + "a-gdadg:#gggggg;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:bg%;}ihiaa {sdci-hh7a:9ab;}ihiaa ihiaa {sdci-hh7a:9ss%;}.aasigadhi {sadhi:aasi;}i {sdci-aah97i:idaa;}.igiidc {sdci-shbha9:sh7d" + + "bh,aghha,aaaaaihgh,hhch-haghs;ehaahc9:des;iasi-hah9c:gaciag;sadhi:aasi;}.ihhhgsgiidc {ehaahc9:ses;bhg9hc:ses;idgaag-hi9aa:cdca;ihgd9gdgca-gdadg:ighchehgaci;ggghdg:edhciag;}.ihhhgsgiidc .igiidcfiasi {a" + + "hca-7ah97i:7ses;sdci-hh7a:9ab;}.ihhhgsgiidc.bdghadaag .igiidcfiasi {gdadg:#ggbggg;}.ihhhgsgiidc.hchgihaa .igiidcfiasi {gdadg:#sgsgsg;ggghdg:aashgai;}.aasifigiidc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hh" + + "ch-haghs;sdci-hh7a:s.dab;ehaahc9-ide:des;ehaahc9-aasi:des;ehaahc9-gh97i:des;iasi-hah9c:gaciag;sadhi:aasi;bhc-ahai7:dses;}.gh97ifigiidc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;eh" + + "aahc9:des;iasi-hah9c:gaciag;sadhi:gh97i;}.gdagbcf7ahaag {sdci-aah97i:idaa;sdci-hh7a:dd%;ahca-7ah97i:9des;gdadg:#ssssss;ehaahc9-ide:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:7es;a7hia-hehga:cdaghe;iasi-hah9c:" + + "aasi;}.hgdcfgdagbcf7ahaag {ehaahc9-aasi:7des;}.ahihfgda i7 {iasi-hah9c:aasi;sdci-aah97i:cdgbha;}.ahihfgda .cd7hih {iasi-hah9c:gaciag;}#idddbhgdfihiaa i7 h {ehaahc9-aasi:9ses;}.ahihfgda {7ah97i:7des;ih" + + "gd9gdgca-gdadg:#gggggg;}.ahihfahhi9dagbc {ehaahc9-aasi:des;ehaahc9-gh97i:des;ahca-7ah97i:7des;}.agdeadac {idgaag-idiidb:9es iahgd;idgaag-gh97i:9es iahgd;idgaag-aasi:9es #9s9s9s;idgaag-ide:9es #9s9s" + + "9s;ahhhihahi9:7haaac;edhhihdc:hihdagia;ahai7:7sses;7-hcaas:9;ehaahc9:ses;ggghdg:edhciag;}.haaagi {ihgd9gdgca-gdadg:#g9gdga;sadhi:aasi;}haaagi.gghiaghh {sdci-hh7a:s.dab;ahai7:9cses;}.hbhaa {sdci-hh7a:d" + + "d%;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;}.ihiaaaehgag {ahai7:7ses;}.iasihcegi {ehaahc9:des;bhg9hc:ses;aagihgha-hah9c:ide;}i7 {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-aah97i:idaa;" + + "sdci-hh7a:dd%;}.ihiaa {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;sdci-aah97i:idaa;}.ahaga {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.aaaaafiddaihg {gaahg:idi7;a" + + "hai7:hgid;7ah97i:gces;ihgd9gdgca-gdadg:#d77ahc;}.iddaihgfaasi {sadhi:aasi;ahai7:hgid;iasi-hah9c:gaciag;}.iddaihgfgh97i {sadhi:gh97i;ahai7:hgid;iasi-hah9c:gaciag;}aha.iddaihg {sadhi:aasi;}.iddaihgfid9f" + + "aasi {sadhi:aasi;}.iddaihgfid9 {gdadg:#ssssss;sadhi:aasi;}.iddaihgfid9fgh97i {sadhi:aasi;}.iddaihgfigiidc {sadhi:aasi;iasi-hah9c:gaciag;ggghdg:edhciag;ehaahc9:ces ses ces ses;bhg9hc:ses;idgaag:ses cdc" + + "a;ihgd9gdgca-gdadg:ighchehgaci;}.iddaihgfigiidc.hchgihaa {ggghdg:hgid;}.iddaihgfigiidcfhgdc {gaahg:gh97i;sadhi:cdca;bhg9hc-aasi:hgid;bhg9hc-gh97i:hgid;idgaag:ses;}.iddaihgfigiidc .igiidcfiasi,.iddaihg" + + "figiidc hehc {ahheah9:iadgd;sdci-hh7a:s.cab;ehaahc9-aasi:des;ehaahc9-gh97i:des;sdci-shbha9:aghha,aaaaaihgh,hhch-haghs;ahca-7ah97i:s.cab;iasi-aagdghihdc:cdca;}.iddaihgfigiidc.bdghadaag .igiidcfiasi {gd" + + "adg:#ggbggg;}.iddaihgfigiidc.hchgihaa .igiidcfiasi {gdadg:9gh9;}.iicfahih9dcigdafaasi {sadhi:aasi;ehaahc9-aasi:des;}.cdaghe,.cdaghe ia,.iaehiaa {a7hia-hehga:cdaghe;}ihiaa.cdaghe,ihiaa.cdaghe ig,ia.ag" + + "he {a7hia-hehga:cdgbha;}.ihifhbhaafaasi {sadhi:aasi;}.ihifhbhaafgh97i {sadhi:aasi;}.ihifhbhaafid9 {sadhi:aasi;sdci-hh7a:dd%;}.ihifhbhaafid9 h {ahca-7ah97i:7ses;ehaahc9-ide:7es;}.ihifhbhaafdssfaasi {" + + "sadhi:aasi;ahai7:7ses;ehaahc9-ide:7es;}.ihifhbhaafdssfgh97i {sadhi:aasi;ehaahc9-ide:7es;}.ihifhbhaafdssfid9 {sadhi:aasi;sdci-hh7a:dd%;ehaahc9-ide:7es;}aha.ihifhbhaa {idgaag-aasi:9es hdaha #7a77hh;id" + + "gaag-gh97i:9es hdaha #7a77hh;idgaag-idiidb:9es hdaha #7a77hh;}aha.aaaaa9 {ahai7:hgid;gaahg:idi7;}aha.aaaaa9faasi {sadhi:aasi;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:7es;7ah97i:9ges;}aha.aaaaa" + + "9fgh97i {sadhi:gh97i;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:7es;7ah97i:9ges;}.aaaaa9fiasi {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#gggggg;sdci-hh7a:dd%;ehaahc9-aasi:7es;ehaahc9-g" + + "h97i:7es;}.aaaaa9fad9hc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#gggggg;sdci-hh7a:dd%;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-gh97i:des;}.aaaaa9fad9dgi {bhg9hc-gh97i:7es;}aha.ad9d {sad" + + "hi:aasi;}.aaaaa7fiasi {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#i7i7i7;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-gh97i:des;ahca-7ah97i:hhes;}.aaaaafadghihdc {gaahg:idi7;ahai7:hgid;7ah97i:7" + + "ces;ihgd9gdgca-gdadg:#d77ahc;edhhihdc:gaahihaa;}.adghihdcfaasi {bhg9hc-aasi:hes;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.aaaaafigahagggbi {gaahg:idi7;ahai7:hgid;7ah97i:7ces;ihgd9g" + + "dgca-gdadg:#d77ahc;}.igahagggbifaasi {ahai7:hgid;bhg9hc-gh97i:7dses;}.igahagggbifgh97i {sadhi:gh97i;ahai7:hgid;ahai7:7gces;}.igahagggbifigiidc {sadhi:aasi;bhg9hc-aasi:ses;bhg9hc-gh97i:ses;bhg9hc-ide:9" + + "es;ggghdg:edhciag;7ah97i:7ces;ihgd9gdgca-gdadg:ighchehgaci;idgaag:cdca;ehaahc9:ses;}.igahagggbifhbh9a {bhg9hc-aasi:hes;bhg9hc-gh97i:hes;bhg9hc-ide:9es;ggghdg:edhciag;7ah97i:7ces;idgaag:cdca;}.igahaggg" + + "bifehi7fgdcihhcag {ihgd9gdgca-gdadg:a7hia;ahai7:hgid;ehaahc9-ide:ses;ehaahc9-idiidb:ses;}.igahagggbihcah {ahai7:bes;7ah97i:7ces;ihgd9gdgca-gdadg:#d77ahc;}.igahagggbifehi7figiidc {sadhi:aasi;bhg9hc-gh9" + + "7i:9es;bhg9hc-ide:9es;bhg9hc-aasi:ses;}.cdsdgaag {idgaag:cdca;}.igahagggbifehi7fahcd {idgaag:cdca;}.igahagggbifehi7 {sadhi:aasi;}.igahagggbifehi7faasi,.igahagggbifehi7fgh97i {sdci-shbha9:sh7dbh,aghha," + + "aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.igahagggbifehi7fiasi {iasi-aagdghihdc:cdca;gdadg:#ssssss;sdci-hh7a:s.dab;ahca-7ah97i:7ges;bhg9hc-aasi:hes;}.hahgg7fehi7fgdcihhcag7 {sadhi:gh97i;ihgd9gdgca-gdadg:a7" + + "hia;gdadg:9gh9;ehaahc9-ide:ses;ehaahc9-idiidb:ses;7ah97i:7ges;idgaag:7es hdaha #d77ahc;}.hahgg7fhcegi7 {sadhi:aasi;ahai7:9gces;aagihgha-hah9c:bhaaaa;bhg9hc-aasi:9es;idgaag:7es hdaha a7hia;ihgd9gdgca-g" + + "dadg:a7hia;}#hahgg7iasi {sdci-shbha9:sh7dbh,dacaah,hhch-haghs;sdci-hh7a:9ab;}#hahgg7sddaihg {sdci-hh7a:9ab;}.hahgg7fehi7figiidc {sadhi:aasi;bhg9hc-aasi:ses;bhg9hc-ide:9es;bhg9hc-gh97i:9es;ggghdg:edhci" + + "ag;idgaag:cdca;}.ahgagidg9fehi7 {sadhi:aasi;}aha.ehi7faasi,aha.ehi7fgh97i {sadhi:aasi;sdci-aah97i:cdgbha;bhg9hc:ses;ahca-7ah97i:7des;ihgd9gdgca-gdadg:#d77ahc;}aha.ggggacifehi7figiidch {ihgd9gdgca-gd" + + "adg:#d77ahc;sadhi:aasi;}aha.idddbhgdh {sadhi:aasi;ihgd9gdgca-gdadg:#d77ahc;7ah97i:7des;ahca-7ah97i:7des;}ga.idddbhgd {ihgd9gdgca-gdadg:#gsg9g9;}ah.idddbhgd {ahhi-hi9aa:cdca;ehaahc9-aasi:des;ehaahc9-id" + + "e:7es;ehaahc9-idiidb:ses;ehaahc9-gh97i:des;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;}ah.bhch9afidddbhgdh {ahhi-hi9aa:cdca;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:ses;ehaah" + + "c9-gh97i:des;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;idgaag-ide:9es hdaha #7d7d7d;sdci-hh7a:s.dab;}aha.hahgg7 {sadhi:aasi;ahai7:hgid;ihgd9gdgca-gdadg:#d77ahc;}aha.9dd9aafhahgg7 {sadhi:gh97i;ihg" + + "d9gdgca-gdadg:#d77ahc;}aha.hahgg7fids {sdci-aah97i:cdgbha;bhg9hc:ses;ahca-7ah97i:7des;sadhi:aasi;ihgd9gdgca-gdadg:#d77ahc;}.bacg {idgaag-idiidb:9es hdaha #cscscs;idgaag-gh97i:9es hdaha #cscscs;idgaag" + + "-ide:9es hdaha #gggggg;idgaag-aasi:9es hdaha #gggggg;ihgd9gdgca-gdadg:#gggggg;sdci-shbha9:aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;ehaahc9:ses;}aha.shaafbhch9ag {ehaahc9:ses;ihgd9gdgca-gdadg:#s7sca" + + "7;idgaag:9es hdaha #sgsgsg;ahai7:9ss%;sadhi:aasi;}aha.sddiag {ahai7:hgid;sadhi:gh97i;ehaahc9-ide:7es;ehaahc9-idiidb:ses;}aha.bahhh9a {sadhi:aasi;sdci-aah97i:cdgbha;sdci-hh7a:dd%;gdadg:iahgd;bhg9hc:se" + + "s;ahca-7ah97i:77es;ahai7:hgid;ehaahc9:7es;}.gh97ifgahgd {idgaag:9es hdaha #9s9s9s;ihgd9gdgca-gdadg:#gsgggg;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;ahhhihahi9:7haaac;edhhihdc:hihd" + + "agia;ahai7:97ses;7-hcaas:9;ehaahc9:9ses;ggghdg:edhciag;}aha.ehgdehhi {ihgd9gdgca-gdadg:#gggggg;idgaag:9es hdaha #b99h7h;ehaahc9:des;}aha.ehgdehhiagah {gaahg:idi7;ehaahc9:9ses;}.bhch9afeh9a {ihgd9gdgca" + + "-gdadg:#ghghgh;}.gdbbaci {edhhihdc:gaahihaa;bhg9hc-ide:7es;ehaahc9:9ses;gaahg:gh97i;}.aaac9dbbaci {ihgd9gdgca:#gggggg;}.daa9dbbaci {ihgd9gdgca-gdadg:#ghghgh;idgaag-ide:#sgsgsg;idgaag-idiidb:#sgsgsg;}." + + "haa9dbbaciagah {bhg9hc-idiidb:des;}.gdbbaciagi7dg {sdci-hh7a:9ab;sdci-aah97i:idaa;ehaahc9-idiidb:des;}.gdbbacisasi {sdci-hh7a:dd%;ehaahc9-idiidb:9es;}.gdbbacishbahihbe {sdci-hh7a:s.cab;}.gdbbaci7aaaia" + + "97agdids {edhhihdc:hihdagia;gh97i:9ses;ide:9ses;ggghdg:edhciag;}aha.eh9afihiaa {gaahg:idi7;ahai7:hgid;}aha.hhaafchah9hihdc {bhg9hc-ide:ses;}ia.hhaafchah9hihdc {ihgd9gdgca-hbh9a:gga(hi9aah/hhaafchafid" + + "9.ge9);ihgd9gdgca-gaeahi:gaeahi-s;ahai7:9bdes;idgaag-gh97i:9es hdaha #sgsgsg;}.ihiehhi {bhg9hc-aasi:7ses;bhg9hc-ide:7ses;bhg9hc-idiidb:7ses;ehaahc9-aasi:9bes;}.ihiehhi igiidc {ihgd9gdgca-gdadg:ighcheh" + + "gaci;idgaag:ses cdca;bhg9hc:ses;ehaahc9:ses;ggghdg:edhciag;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;iasi-hah9c:aasi;}.ihiehhi ah {ehaahc9-aasi:ses;ehaahc9-ide:ses;ehaahc9-gh97i:ses;" + + "ehaahc9-idiidb:ges;ahhi-hi9aa-i9ea:cdca;sdci-hh7a:s.dab;}.aaihfhiabfhgihaa {ahhi-hi9aa-hbh9a:gga(hbh9ah/haaagiaafhgihdc.9hs);}.aaihfhiabfhgihaa igiidc {sdci-aah97i:idaa;}aha.gh97ifeh9afgdciaci {ahai7" + + ":hgid;ihgd9gdgca-gdadg:a7hia;}aha.hbhaafhgifiddaihg {ihgd9gdgca-gdadg:#9s9s9s;7ah97i:7des;ehaahc9-idiidb:des;}aha.hgifigiidc {sdci-hh7a:s.dab;ehaahc9-aasi:7es;ehaahc9-gh97i:7es;sadhi:aasi;iasi-hah9c:" + + "gaciag;}aha.eh9afihiaa {bhg9hc:ses;}.eh9afihiaa hcegi,.eh9afihiaa hgibhi,.eh9afihiaa haaagi,.eh9afihiaa iasihgah,.sdgbfgdciaci iasihgah {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}a" + + "ha.eh9afahih {bhg9hc:9ses;sadhi:aasi;}aha.bdahafsdgb {idgaag:9es hdaha #a9a9a9;bhc-ahai7:gases;}aha.sdgbfgdciaci {bhg9hc:7as;gaahg:idi7;ahai7:hgid;}.sdgbfgdciaci h {sdci-hh7a:9ab;}aha.sdgbfihiaafihg" + + " {idgaag-aasi:9es hdaha #b99h7h;idgaag-gh97i:9es hdaha #b99h7h;gaahg:idi7;}.sdgbfihiaafiasi {ahca-7ah97i:7aes;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;sdci-aah97i:idaa;gdadg:#hhhh" + + "hh;sdci-aah97i:idaa;aagihgha-hah9c:ihhaahca;bhg9hc:ses;ehaahc9-aasi:des;}.iicfeh9a9dcigdafaasi {ehaahc9-ide:ges;sadhi:aasi;}.iicfeh9a9dcigdafgh97i {ehaahc9-ide:ges;sadhi:gh97i;}aha.sdgbfgdcigdah {gaa" + + "hg:idi7;}aha.ghahdfigiidch {ehaahc9:des;}.aaig9sdgaag {idgaag:9es hdaha gaa;}.aaig9 {idgaag:9es hdaha #iii;}.haahcgaafhahgg7 {ahai7:hgid;gaahg:idi7;bhg9hc:9ses;ihgd9gdgca-gdadg:#ac7ahs;edhhihdc:gaah" + + "ihaa;}aha.hahgg7fid9 {edhhihdc:gaahihaa;ihgd9gdgca-gdadg:#h9h9h9;idgaag-idiidb:7es hdaha #d9a9sb;}.hahgg7fgdcihhcag {ahai7:hgid;bhg9hc-aasi:7ses;ehaahc9-ide:9ses;}aha.hahgg7fgefaasifgdgcag {sadhi:aa" + + "si;}aha.hahgg7fgefgh97ifgdgcag {sadhi:gh97i;}.hahgg7fihiaa {sdci-hh7a:dd%;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-ide:des;}.hahgg7fgghiaghh {ehaahc9-aasi:9ses;ehaahc9-gh97i:ses;ehaahc9-ide:des;sdci-" + + "hh7a:dd%;ihgd9gdgca-gdadg:#gggggg;idgaag:9es hdaha #sgsgsg;}aha.hahgg7figiidcfgda {ehaahc9-ide:des;idgaag-ide:9es hdaha #sgsgsg;sadhi:aasi;ahai7:9ss%;}aha.hahgg7figiidcfgdcihhcag {sadhi:gh97i;}aha.hah" + + "gg7fhaa9ghiaghhfgda {idgaag-idiidb:9es hdaha #sgsgsg;sadhi:aasi;ahai7:9ss%;7ah97i:7des;}aha.hahgg7fgghiaghhfgdcihhcag {idgaag:7es hdaha #d9a9sb;ehaahc9:des;}.hgdcehiaafiasi {sadhi:aasi;bhg9hc:ses;7ah9" + + "7i:7des;ahca-7ah97i:7des;ehaahc9-gh97i:des;sdci-hh7a:dd%;sdci-aah97i:idaa;}aha.hgdc {ahai7:7des;7ah97i:7des;sadhi:aasi;}a:ahcd.hahgg79ghiaghhfiasi {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;sdci-hh7a" + + "{sadhi:aasi;ahhi-hi9aa:cdca;bhg9hc-ide:hes;}.7aae9dcihhcag {edhhihdc:hihdagia;ide:7es;gh97i:7es;bhg9hc:ses;ehaahc9:ses;idgaag:ses cdca;7-hcaas:g;ggghdg:edhciag;ahhhihahi9:hc7aghi;ihgd9gdgca-gdadg:ighc" + + "hehgaci;}.7aae9dcihhcagaihihg {bhg9hc:ses;ehaahc9:ses;ggghdg:edhciag;ahhhihahi9:hc7aghi;}.9gh-bdagaa .7aae9dcihhcag {gh97i:ges;}.9gh-ahhad9 .9gh-ehcaa .7aae9dcihhcag {gh97i:7ses;}.sdgb7hih {sdci-hh7a" + + ":9ab;}ihiaa.cdihs9shiaa {idgaag:ses;}ihiaa.cdihs9shiaa .aasi9dagbc {iasi-hah9c:gh97i;aagihgha-hah9c:ide;sdci-aah97i:idaa;}ihiaa.cdihs9shiaa .gh97i9dagbc {iasi-hah9c:aasi;}ihiaa.hgeagihiaa {bhg9hc:s s " + + "s 7es;}ihiaa.hgeagihiaa iida9 ig ia.geadhaf7ahaag {idgaag-ide:9es hdaha g9i(9g7,9g7,9g7);idgaag-gh97i:9es hdaha g9i(9g7,9g7,9g7);idgaag-idiidb:cdca;idgaag-aasi:9es hdaha g9i(9g7,9g7,9g7);ihgd9gdgca:g9" + + "i(77d,77d,77d);ehaahc9:s;sdci-hh7a:s;7ah97i:hses;}ihiaa.hgeagihiaa iida9 ig ia.geadhaf7ahaag ihiaa {sdci-aah97i:ass;sdci-hh7a:9ab;ihgd9gdgca:ighchehgaci;gdadg:iahgd;ahai7:9ss%;bhg9hc:s;}ihiaa.hgeagihi" + + "aa iida9 ig ia.gdcihhchfgeadha {bhg9hc:s;ehaahc9-aasi:s;}aha.geadha {bhg9hc:s;ehaahc9:s;daagsada:hgid;7ah97i:7hses;ahai7:asses;idgaag:9es hdaha g9i(9g7,9g7,9g7);ihgd9gdgca:a7hia;}aha.geadha ihiaa {7ah" + + "97i:9ss%;idgaag:cdca;}.geadha-daagaghia {}aha.geadha ihiaa iida9 ig {7ah97i:7des;}aha.geadha ihiaa iida9 ig#geadhafiahcdgda {7ah97i:hgid;}.geadhafsddiag {idgaag-ide:cdca;idgaag-gh97i:9es hdaha g9i(9g7" + + ",9g7,9g7);idgaag-idiidb:9es hdaha g9i(9g7,9g7,9g7);idgaag-aasi:9es hdaha g9i(9g7,9g7,9g7);7ah97i:hses;ihgd9gdgca:g9i(77d,77d,77d);}.iaehiaa {sdci-aah97i:idaa;}.ihiaaf7ahaag {sdci-aah97i:idaa;sdci-hh7a" + + ":9ab;gdadg:#ssssss;ahca-7ah97i:7hes;ahai7:9ss%;}.gh97ifihiaaf7ahaag {ahca-7ah97i:7hes;ahai7:hes;sdci-aah97i:idaa;gdadg:#ssssss;sdci-hh7a:9ab;}.aasifihiaaf7ahaag {ahca-7ah97i:7hes;ahai7:ges;sdci-aah97i" + + "{ihgd9gdgca-gdadg:#gggggg;ia77bgd-abdas:ses;ia77bgd-ehgs:ses;ia77bgd-shsshf:ses;ia77bgd-shi:hces;faadbg-abdas:des;faadbg-ehgs:des;faadbg-shi:hces;faadbg-shsshf:ses;ghgs-abah:9ss%;}.aabhcfhaiahiaa {" + + "sdci-hh7a:9ab;}#shaahgdgb {edhhihdc:hihdagia;ide:ses;aasi:ses;ahai7:ses;7ah97i:ses;}.aaaaafhgiihih {ihgd9gdgca-gdadg:#gggggg;7ah97i:7ses;}.gdagbcf7ahaagfadc9 {sdci-hh7a:dd%;7ah97i:hses;gdadg:#sssss" + + "s;}aha.ihifhaafeagbhhhhdch,aha.ihifihhhgfeagbhhhhdch {sadhi:aasi;ahai7:hgid;iasi-hah9c:gaciag;}aha.eagbhhhhdchbhhaehhi {bhg9hc:ses;ehaahc9-aasi:7ses;ehaahc9-ide:des;ehaahc9-idiidb:des;}aha.eagbhhhhdch" + + "bhhaehhi ga {bhg9hc:ses;ehaahc9:ses ses ses 9ses;}aha.hgdcehiaafiasi {sadhi:aasi;bhg9hc:ses;7ah97i:7des;ahca-7ah97i:7des;ehaahc9-gh97i:des;sdci-aah97i:idaa;}aha.hgdc {ahai7:7des;7ah97i:7des;sadhi:a" + + "asi;}a.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:ahhhiaa.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:7daag.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:hgihaa.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}.ahia" + + "{9heha:#ggssss;ghgs-hhbdas:idaa;}.gh97ifiddaihg {sadhi:gh97i;ehaahc9-gh97i:des;}aha.asfhahgg7fid9 {bhg9hc-aasi:hes;bhg9hc-gh97i:hes;bhg9hc-idiidb:9ses;idgaag-idiidb:7es hdaha #d9a9sb;}.asfhahgg7 {ah" + + "ai7:hgid;gaahg:idi7;7ah97i:9hses;ehaahc9-ide:ses;bhg9hc:ses;ihgd9gdgca-gdadg:#d77ahc;}aha.asfhahgg7faasiaca {sadhi:aasi;}aha.asfhahgg7fgh97iaca {sadhi:gh97i;}.ahih h {sdci-hh7a:9ab;}.asfhahgg7fgdcihh" + + "cag {sadhi:aasi;bhg9hc-ide:des;}ia.asfhahgg7fiasi {sdci-hh7a:s.dab;}.asfhahgg7fiasi hcegi {sdci-hh7a:s.dab;}.asfhahgg7fiasi haaagi {sdci-hh7a:s.dab;}ia.asfihiaaaehgag {ahai7:9ses;}.asfihiaa9aaa {ehaah" + + "c9-aasi:9ses;ehaahc9-gh97i:des;}aha.hgihdcfhiae {ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:des;ehaahc9-gh97i:9ses;bhg9hc-gh97i:9des;ihgd9gdgca-gdadg:a7hia;idgaag-idiidb:7es dgihai;idgaag-gh97i:7" + + "es dgihai;ahai7:dd%;}aha.aaghhhdcfhiae {ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:des;ehaahc9-gh97i:des;ihgd9gdgca-gdadg:a7hia;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.i7" + + "ac {ihgd9gdgca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.i7acfida9 {ehaahc9-ide:des;ehaahc9-idiidb:" + + "des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.aaha {ihgd9gdgca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;a" + + "hai7:dd%;}aha.aahafida9 {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.haafhiae {ehaahc9-ide:9ses;ehaahc9-idiidb:9ses;iasi-hah9c:gaciag;}aha.casifhiae {ihgd9gd" + + "gca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.hsfida9 {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aa" + + "si:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.ehghbaiagh {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.eh9afida9 {ehaahc9-ide:9ses;ehaahc9-aasi:9ses;}aha.h7dgifhgi" + + "hdcfchba {sdci-hh7a:9ss%;}aha.h7dgifaaghhhdcfchba {sdci-hh7a:9ss%;}.gahaagfcdihshghihdc {ahheah9:cdca;}.gahaaghaabaci {edhhihdc:hihdagia;ide:-9es;aasi:-9ses;7ah97i:9es;ahca-7ah97i:9es;idgaag:cdca;eh" + + "aahc9:ses;bhg9hc:ses;ahai7:9es;daagsada:7haaac;}ihiaa.dig i7 aha {edhhihdc:gaahihaa;ide:-9ses;7ah97i:9es;daagsada:7haaac;}.idaaehiaah ahiaa,.ahiaa {sdci-aah97i:idaa;sdci-hh7a:9ab;}shaaahai.ghahddgdge " + + "{ehaahc9:ses;idgaag:cdca;iasi-hah9c:aasi;}shaaahai.ghahddgdge aa9aca {ehaahc9:ses;}shaaahai.ghahddgdge aha {ehaahc9-aasi:7ses;ehaahc9-idiidb:des;}shaaahai.ghahddgdge ahiaa {ahheah9:iadgd;bhg9hc-aasi:9" + + "79.ihiaa,77.ihiaa {bhg9hc:ses;}.9gh-bdagaa,.ahdhfihi7haa9dciaci,.hahgg7fid9,.haahcgaafhahgg7 {7ddb:9;}.eghcghehaehhi {ahhi-hi9aa-i9ea:cdca;}.ihiehhi igiidc,.aaaaa7fbacg igiidc,.aaaaahfbacg igiidc,.ihh" + + "hgsgiidc,.iddaihgfigiidc,.igahagggbihfahgchba hcegi,.shaaa9hiabsgdahagsgaa hcegi {ahai7:hgid;daagsada:ahhhiaa;}.gbaiaeaahahc9h {ehaahc9-aasi:7ses;sdci-aah97i:idaa;sdci-hh7a:9ss%;}.9ghaids {ahai7:9ss%;" + + "sdci-shbha9:sh7dbh,dacaah,hhch-haghs;sdci-hh7a:9ss%;ehaahc9:ses;bhg9hc:ses;idgaag-idiidb:ses;idgaag-aasi:ses;idgaag-gh97i:ses;ihgd9gdgca-gdadg:#gshghg;daagsada:7haaac;}.digids hcegi {ggghdg:aashgai;}." + + "bgaihehhi {sadhi:aasi;ahheah9:hcahca;ehaahc9:s 7ses;bhg9hc:s;}.bgaihehhi .cd7hagah {ahhi-hi9aa:cdca;}.s9fgaciagidhhihdc {bhg9hc:ses hgid;}.ahdhfeh9a9dciaci {ihgd9gdgca-hbh9a:gga(hi9aah/ahdhfid9.ge9);i" + + "hgd9gdgca-gaeahi:gaeahi-9;}shca9haghaaaaagihdc,.asfhahgg7fid9,#aaaaa7,.aaaaa7fihifshaafaasi,.iddaihg,.iddaihgfid9,.aaaaa7fihih,.aaaaa7fbacg .ihifbha,.aaaaa7fihifshaafgh97i,aha.aaaaa7fhgihaa .ihifbha,." + + "ahdhfaaaaa9,.gdagbcf7ahaagfadc9,.ahdhfeh9ashiaa,.ahdhfeh9agddiag,.igahagggbifehi7fgdcihhcag,.ggggacifehi7figiidch,.hahgg7fids,#aaaaah,.aaaaahfchah9hihdc,.aaaaahfhgihaa .ihifbha,.ahdhfihi .ihisd9,.ahdh" + + "fihi .haaagiaa .ihisd9,.ahdhfihighaa,#aaaaa9,.aaaaa9,aha.9ghaids .s7ag,aha.9ghaids .sig,aha.9ghaids .sig ia,.gdagbcf7ahaag,.ihifhbhaafid9,.ihifhbhaafdssfid9,.eagbfihifhaaagiaa .ihifhbhaafid9,.ahdhfaaa" + + "aah {ihgd9gdgca-hbh9a:gga(heghiahfgfd.ec9);ihgd9gdgca-gaeahi:gaeahi-s;}shca9haghaaaaagihdc {ihgd9gdgca-edhhihdc:-ses -ses;7ah97i:9gces;}.asfhahgg7fid9 {ihgd9gdgca-edhhihdc:-ses -9gces;7ah97i:97ses;}#a" + + "aaaa7,.aaaaa7fihifshaafaasi {ihgd9gdgca-edhhihdc:-ses -7aces;7ah97i:gces;}.iddaihg,.iddaihgfid9 {ihgd9gdgca-edhhihdc:-ses -h9aes;7ah97i:gces;}a.aaaaa7fihih,.aaaaa7fbacg .ihifbha,.aaaaa7fihifshaafgh97i" + + " {ihgd9gdgca-edhhihdc:-ses -hages;7ah97i:hhes;}aha.aaaaa7fhgihaa .ihifbha {ihgd9gdgca-edhhihdc:-ses -hdbes;7ah97i:hhes;}.ahdhfaaaaa9 {ihgd9gdgca-edhhihdc:-ses -ghses;7ah97i:h7es;}.gdagbcf7ahaagfadc9 {" + + "ihgd9gdgca-edhhihdc:-ses -ga7es;7ah97i:hses;}.ahdhfeh9ashiaa {ihgd9gdgca-edhhihdc:-ses -gd7es;7ah97i:7des;}.hahgg7fgefgh97ifgdgcag {ihgd9gdgca-edhhihdc:-h9es -99ges;ahai7:9ses;7ah97i:ces;}.hahgg7fid9 " + + "{ihgd9gdgca-hbh9a:gga(hi9aah/haahcgaafehcaafid9.ge9);ihgd9gdgca-gaeahi:gaeahi-s;}.eh9afihiaa,aha.eh9afgdcigdah,aha.sdgbfgdcigdah,aha.9gh-ahhad9 aha.9gh-bdagaa aha.si,aha.gh97ifeh9afgdciaci aha.9gh-bda" + + "gaa aha.7a,aha.ggahiahh7hga9dciaciagah aha.9gh-bdagaa aha.si,aha.cdihs99dciaciagah aha.9gh-bdagaa aha.si,aha.agdesdshh7hga9dciaciagah aha.9gh-bdagaa aha.si,.sdgbfihiaafihg,aha.9gh-ahhad9 aha.9gh-bdaga" + + "a aha.7a,.hcaggaacfihiaashg,.ihiaaf7ahaag,.gh97ifihiaaf7ahaag,.aasifihiaaf7ahaag,.igiidcfid9,.hchgihaa .igiidcfid9 {ihgd9gdgca-hbh9a:gga(ihhaaeghiahfgfd.ec9);ihgd9gdgca-gaeahi:gaeahi-s;}.eh9afihiaa,ah" + + "a.eh9afgdcigdah,aha.sdgbfgdcigdah,aha.9gh-ahhad9 aha.9gh-bdagaa aha.si,aha.gh97ifeh9afgdciaci aha.9gh-bdagaa aha.7a,aha.ggahiahh7hga9dciaciagah aha.9gh-bdagaa aha.si,aha.cdihs99dciaciagah aha.9gh-bdag" + + "aa aha.si,aha.agdesdshh7hga9dciaciagah aha.9gh-bdagaa aha.si {ihgd9gdgca-edhhihdc:-ses -ses;7ah97i:7des;}.sdgbfihiaafihg,aha.9gh-ahhad9 aha.9gh-bdagaa aha.7a,.hcaggaacfihiaashg,.ihiaaf7ahaag,.gh97ifih" + + "iaaf7ahaag,.aasifihiaaf7ahaag {ihgd9gdgca-edhhihdc:-ses -7des;7ah97i:7aes;}.igiidcfid9 {edhhihdc:gaahihaa;bhg9hc-gh97i:7es;ehaahc9-gh97i:9hes;ehaahc9-aasi:9hes;bhg9hc-aasi:7es;a7hia-hehga:cdaghe;ihgd9" + + "gdgca-edhhihdc:-ses -ddes;7ah97i:77es;}.hchgihaa .igiidcfid9 {ihgd9gdgca-edhhihdc:-ses -bbes;7ah97i:77es;}.aashgaifad9d,.hchgihaa .igiidcfaasi,.igiidcfaasi,.igiidcfgh97i,.hchgihaa .igiidcfgh97i,.hgdcf" + + "hcsd,.hgdcfaggdg {ihgd9gdgca-hbh9a:gga(ihhaaeghiahfghgh.ec9);ihgd9gdgca-gaeahi:cd-gaeahi;}.aashgaifad9d {ihgd9gdgca-edhhihdc:-ses -ses;ahai7:c7es;7ah97i:hdes;}.hchgihaa .igiidcfaasi {ihgd9gdgca-edhhih" + + "dc:-c7es -ses;ahai7:9ges;7ah97i:77es;}.igiidcfaasi {edhhihdc:hihdagia;ide:ses;aasi:-7es;ihgd9gdgca-edhhihdc:-daes -ses;ahai7:9hes;7ah97i:77es;}.igiidcfgh97i {edhhihdc:hihdagia;ide:ses;gh97i:-7es;ihgd9" + + "gdgca-edhhihdc:-9sdes -ses;ahai7:9hes;7ah97i:77es;}.hchgihaa .igiidcfgh97i {ihgd9gdgca-edhhihdc:-977es -ses;ahai7:9hes;7ah97i:77es;}.hgdcfhcsd {ihgd9gdgca-edhhihdc:-c7es -77es;ahai7:9ges;7ah97i:9des;}" + + ".hgdcfaggdg {ihgd9gdgca-edhhihdc:-daes -77es;ahai7:9ges;7ah97i:9ges;}"; + + var largeNewValue = largeTest, + len = largeTest.length, + count = nextRandom() % 20, + removeBound = len-(count*100), + logData = []; + for (; count > 0; count--) { + var removePos = nextRandom() % removeBound; + var removeLength = 1+nextRandom()%100; + logData.push("(" + removePos + ", " + removeLength + ")"); + largeNewValue = largeNewValue.substring(0, removePos) + + largeNewValue.substring(removePos + removeLength); + } + log("len: " + len + " count: " + count + " removed ( " + logData.join(", ") + " )"); + + diffResult = diff.diffWords(largeTest, largeNewValue); + log("diffResult length: " + diffResult.length); + var removeCount = 0; + var removeChanges = [], addChanges = [], testChanges = []; + for (var i = 0; i < diffResult.length; i++) { + if (diffResult[i].removed) { + log("remove Change " + i, diffResult[i]); + removeChanges.push(diffResult[i].value); + } else if (diffResult[i].added) { + log("add Change " + i, diffResult[i]); + addChanges.push(diffResult[i].value); + } else { + log("no Change " + i, diffResult[i]); + removeChanges.push(diffResult[i].value); + addChanges.push(diffResult[i].value); + } + } + + log("diffResult remove length: " + removeCount); + assert.equal(largeTest.replace(/s+/g, ""), removeChanges.join("").replace(/s+/g, ""), "New Diff results match"); + assert.equal(largeNewValue.replace(/s+/g, ""), addChanges.join("").replace(/s+/g, ""), "Old Diff results match"); +}; + +exports['Patch'] = function() { + // Create patch + var oldFile = + "value\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "remove value\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "remove value\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "value\n" + + "context\n" + + "context"; + var newFile = + "new value\n" + + "new value 2\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "add value\n" + + "context\n" + + "context\n" + + "context\n" + + "context\n" + + "new value\n" + + "new value 2\n" + + "context\n" + + "context"; + var expectedResult = + "Index: testFileName\n" + + "===================================================================\n" + + "--- testFileName\tOld Header\n" + + "+++ testFileName\tNew Header\n" + + "@@ -1,5 +1,6 @@\n" + + "+new value\n" + + "+new value 2\n" + + "-value\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + "@@ -7,9 +8,8 @@\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + "-remove value\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + "@@ -17,20 +17,21 @@\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + "-remove value\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + "+add value\n" + + " context\n" + + " context\n" + + " context\n" + + " context\n" + + "+new value\n" + + "+new value 2\n" + + "-value\n" + + " context\n" + + " context\n" + + "\\ No newline at end of file\n"; + + diffResult = diff.createPatch("testFileName", oldFile, newFile, "Old Header", "New Header"); + assert.equal( + expectedResult, + diffResult); + + expectedResult = + "Index: testFileName\n" + + "===================================================================\n" + + "--- testFileName\tOld Header\n" + + "+++ testFileName\tNew Header\n"; + diffResult = diff.createPatch("testFileName", oldFile, oldFile, "Old Header", "New Header"); + assert.equal( + expectedResult, + diffResult, + "Patch same diffResult Value"); +}; + +exports['convertToDMP'] = function() { + diffResult = diff.diffWords("New Value ", "New ValueMoreData "); + + assert.deepEqual( + [[0,'New '],[1,'ValueMoreData'],[-1,'Value'],[0,' ']], + diff.convertChangesToDMP(diffResult), + "DMP conversion of diffResult"); +}; diff --git a/node_modules/vows/node_modules/eyes/LICENSE b/node_modules/vows/node_modules/eyes/LICENSE new file mode 100644 index 0000000..a1edd93 --- /dev/null +++ b/node_modules/vows/node_modules/eyes/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2009 cloudhead + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vows/node_modules/eyes/Makefile b/node_modules/vows/node_modules/eyes/Makefile new file mode 100644 index 0000000..a121dea --- /dev/null +++ b/node_modules/vows/node_modules/eyes/Makefile @@ -0,0 +1,4 @@ +test: + @@node test/eyes-test.js + +.PHONY: test diff --git a/node_modules/vows/node_modules/eyes/README.md b/node_modules/vows/node_modules/eyes/README.md new file mode 100644 index 0000000..c4f6f76 --- /dev/null +++ b/node_modules/vows/node_modules/eyes/README.md @@ -0,0 +1,73 @@ +eyes +==== + +a customizable value inspector for Node.js + +synopsis +-------- + +I was tired of looking at cluttered output in the console -- something needed to be done, +`sys.inspect()` didn't display regexps correctly, and was too verbose, and I had an hour or two to spare. +So I decided to have some fun. _eyes_ were born. + +![eyes-ss](http://dl.dropbox.com/u/251849/eyes-js-ss.gif) + +_example of the output of a user-customized eyes.js inspector_ + +*eyes* also deals with circular objects in an intelligent way, and can pretty-print object literals. + +usage +----- + + var inspect = require('eyes').inspector({styles: {all: 'magenta'}}); + + inspect(something); // inspect with the settings passed to `inspector` + +or + + var eyes = require('eyes'); + + eyes.inspect(something); // inspect with the default settings + +you can pass a _label_ to `inspect()`, to keep track of your inspections: + + eyes.inspect(something, "a random value"); + +If you want to return the output of eyes without printing it, you can set it up this way: + + var inspect = require('eyes').inspector({ stream: null }); + + sys.puts(inspect({ something: 42 })); + +customization +------------- + +These are the default styles and settings used by _eyes_. + + styles: { // Styles applied to stdout + all: 'cyan', // Overall style applied to everything + label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]` + other: 'inverted', // Objects which don't have a literal representation, such as functions + key: 'bold', // The keys in object literals, like 'a' in `{a: 1}` + special: 'grey', // null, undefined... + string: 'green', + number: 'magenta', + bool: 'blue', // true false + regexp: 'green', // /\d+/ + }, + + pretty: true, // Indent object literals + hideFunctions: false, // Don't output functions at all + stream: process.stdout, // Stream to write to, or null + maxLength: 2048 // Truncate output if longer + +You can overwrite them with your own, by passing a similar object to `inspector()` or `inspect()`. + + var inspect = require('eyes').inspector({ + styles: { + all: 'magenta', + special: 'bold' + }, + maxLength: 512 + }); + diff --git a/node_modules/vows/node_modules/eyes/lib/eyes.js b/node_modules/vows/node_modules/eyes/lib/eyes.js new file mode 100644 index 0000000..10d964b --- /dev/null +++ b/node_modules/vows/node_modules/eyes/lib/eyes.js @@ -0,0 +1,236 @@ +// +// Eyes.js - a customizable value inspector for Node.js +// +// usage: +// +// var inspect = require('eyes').inspector({styles: {all: 'magenta'}}); +// inspect(something); // inspect with the settings passed to `inspector` +// +// or +// +// var eyes = require('eyes'); +// eyes.inspect(something); // inspect with the default settings +// +var eyes = exports, + stack = []; + +eyes.defaults = { + styles: { // Styles applied to stdout + all: 'cyan', // Overall style applied to everything + label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]` + other: 'inverted', // Objects which don't have a literal representation, such as functions + key: 'bold', // The keys in object literals, like 'a' in `{a: 1}` + special: 'grey', // null, undefined... + string: 'green', + number: 'magenta', + bool: 'blue', // true false + regexp: 'green', // /\d+/ + }, + pretty: true, // Indent object literals + hideFunctions: false, + showHidden: false, + stream: process.stdout, + maxLength: 2048 // Truncate output if longer +}; + +// Return a curried inspect() function, with the `options` argument filled in. +eyes.inspector = function (options) { + var that = this; + return function (obj, label, opts) { + return that.inspect.call(that, obj, label, + merge(options || {}, opts || {})); + }; +}; + +// If we have a `stream` defined, use it to print a styled string, +// if not, we just return the stringified object. +eyes.inspect = function (obj, label, options) { + options = merge(this.defaults, options || {}); + + if (options.stream) { + return this.print(stringify(obj, options), label, options); + } else { + return stringify(obj, options) + (options.styles ? '\033[39m' : ''); + } +}; + +// Output using the 'stream', and an optional label +// Loop through `str`, and truncate it after `options.maxLength` has been reached. +// Because escape sequences are, at this point embeded within +// the output string, we can't measure the length of the string +// in a useful way, without separating what is an escape sequence, +// versus a printable character (`c`). So we resort to counting the +// length manually. +eyes.print = function (str, label, options) { + for (var c = 0, i = 0; i < str.length; i++) { + if (str.charAt(i) === '\033') { i += 4 } // `4` because '\033[25m'.length + 1 == 5 + else if (c === options.maxLength) { + str = str.slice(0, i - 1) + '…'; + break; + } else { c++ } + } + return options.stream.write.call(options.stream, (label ? + this.stylize(label, options.styles.label, options.styles) + ': ' : '') + + this.stylize(str, options.styles.all, options.styles) + '\033[0m' + "\n"); +}; + +// Apply a style to a string, eventually, +// I'd like this to support passing multiple +// styles. +eyes.stylize = function (str, style, styles) { + var codes = { + 'bold' : [1, 22], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'cyan' : [36, 39], + 'magenta' : [35, 39], + 'blue' : [34, 39], + 'yellow' : [33, 39], + 'green' : [32, 39], + 'red' : [31, 39], + 'grey' : [90, 39] + }, endCode; + + if (style && codes[style]) { + endCode = (codes[style][1] === 39 && styles.all) ? codes[styles.all][0] + : codes[style][1]; + return '\033[' + codes[style][0] + 'm' + str + + '\033[' + endCode + 'm'; + } else { return str } +}; + +// Convert any object to a string, ready for output. +// When an 'array' or an 'object' are encountered, they are +// passed to specialized functions, which can then recursively call +// stringify(). +function stringify(obj, options) { + var that = this, stylize = function (str, style) { + return eyes.stylize(str, options.styles[style], options.styles) + }, index, result; + + if ((index = stack.indexOf(obj)) !== -1) { + return stylize(new(Array)(stack.length - index + 1).join('.'), 'special'); + } + stack.push(obj); + + result = (function (obj) { + switch (typeOf(obj)) { + case "string" : obj = stringifyString(obj.indexOf("'") === -1 ? "'" + obj + "'" + : '"' + obj + '"'); + return stylize(obj, 'string'); + case "regexp" : return stylize('/' + obj.source + '/', 'regexp'); + case "number" : return stylize(obj + '', 'number'); + case "function" : return options.stream ? stylize("Function", 'other') : '[Function]'; + case "null" : return stylize("null", 'special'); + case "undefined": return stylize("undefined", 'special'); + case "boolean" : return stylize(obj + '', 'bool'); + case "date" : return stylize(obj.toUTCString()); + case "array" : return stringifyArray(obj, options, stack.length); + case "object" : return stringifyObject(obj, options, stack.length); + } + })(obj); + + stack.pop(); + return result; +}; + +// Escape invisible characters in a string +function stringifyString (str, options) { + return str.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/[\u0001-\u001F]/g, function (match) { + return '\\0' + match[0].charCodeAt(0).toString(8); + }); +} + +// Convert an array to a string, such as [1, 2, 3]. +// This function calls stringify() for each of the elements +// in the array. +function stringifyArray(ary, options, level) { + var out = []; + var pretty = options.pretty && (ary.length > 4 || ary.some(function (o) { + return (o !== null && typeof(o) === 'object' && Object.keys(o).length > 0) || + (Array.isArray(o) && o.length > 0); + })); + var ws = pretty ? '\n' + new(Array)(level * 4 + 1).join(' ') : ' '; + + for (var i = 0; i < ary.length; i++) { + out.push(stringify(ary[i], options)); + } + + if (out.length === 0) { + return '[]'; + } else { + return '[' + ws + + out.join(',' + (pretty ? ws : ' ')) + + (pretty ? ws.slice(0, -4) : ws) + + ']'; + } +}; + +// Convert an object to a string, such as {a: 1}. +// This function calls stringify() for each of its values, +// and does not output functions or prototype values. +function stringifyObject(obj, options, level) { + var out = []; + var pretty = options.pretty && (Object.keys(obj).length > 2 || + Object.keys(obj).some(function (k) { return typeof(obj[k]) === 'object' })); + var ws = pretty ? '\n' + new(Array)(level * 4 + 1).join(' ') : ' '; + + var keys = options.showHidden ? Object.keys(obj) : Object.getOwnPropertyNames(obj); + keys.forEach(function (k) { + if (Object.prototype.hasOwnProperty.call(obj, k) + && !(obj[k] instanceof Function && options.hideFunctions)) { + out.push(eyes.stylize(k, options.styles.key, options.styles) + ': ' + + stringify(obj[k], options)); + } + }); + + if (out.length === 0) { + return '{}'; + } else { + return "{" + ws + + out.join(',' + (pretty ? ws : ' ')) + + (pretty ? ws.slice(0, -4) : ws) + + "}"; + } +}; + +// A better `typeof` +function typeOf(value) { + var s = typeof(value), + types = [Object, Array, String, RegExp, Number, Function, Boolean, Date]; + + if (s === 'object' || s === 'function') { + if (value) { + types.forEach(function (t) { + if (value instanceof t) { s = t.name.toLowerCase() } + }); + } else { s = 'null' } + } + return s; +} + +function merge(/* variable args */) { + var objs = Array.prototype.slice.call(arguments); + var target = {}; + + objs.forEach(function (o) { + Object.keys(o).forEach(function (k) { + if (k === 'styles') { + if (! o.styles) { + target.styles = false; + } else { + target.styles = {} + for (var s in o.styles) { + target.styles[s] = o.styles[s]; + } + } + } else { + target[k] = o[k]; + } + }); + }); + return target; +} + diff --git a/node_modules/vows/node_modules/eyes/package.json b/node_modules/vows/node_modules/eyes/package.json new file mode 100644 index 0000000..0693505 --- /dev/null +++ b/node_modules/vows/node_modules/eyes/package.json @@ -0,0 +1,39 @@ +{ + "name": "eyes", + "description": "a customizable value inspector", + "url": "http://github.com/cloudhead/eyes.js", + "keywords": [ + "inspector", + "debug", + "inspect", + "print" + ], + "author": { + "name": "Alexis Sellier", + "email": "self@cloudhead.net" + }, + "contributors": [ + { + "name": "Charlie Robbins", + "email": "charlie@nodejitsu.com" + } + ], + "licenses": [ + "MIT" + ], + "main": "./lib/eyes", + "version": "0.1.8", + "scripts": { + "test": "node test/*-test.js" + }, + "directories": { + "lib": "./lib", + "test": "./test" + }, + "engines": { + "node": "> 0.1.90" + }, + "readme": "eyes\n====\n\na customizable value inspector for Node.js\n\nsynopsis\n--------\n\nI was tired of looking at cluttered output in the console -- something needed to be done,\n`sys.inspect()` didn't display regexps correctly, and was too verbose, and I had an hour or two to spare. \nSo I decided to have some fun. _eyes_ were born.\n\n![eyes-ss](http://dl.dropbox.com/u/251849/eyes-js-ss.gif)\n\n_example of the output of a user-customized eyes.js inspector_\n\n*eyes* also deals with circular objects in an intelligent way, and can pretty-print object literals.\n\nusage\n-----\n\n var inspect = require('eyes').inspector({styles: {all: 'magenta'}});\n\n inspect(something); // inspect with the settings passed to `inspector`\n\nor\n\n var eyes = require('eyes');\n\n eyes.inspect(something); // inspect with the default settings\n\nyou can pass a _label_ to `inspect()`, to keep track of your inspections:\n\n eyes.inspect(something, \"a random value\");\n\nIf you want to return the output of eyes without printing it, you can set it up this way:\n\n var inspect = require('eyes').inspector({ stream: null });\n\n sys.puts(inspect({ something: 42 }));\n\ncustomization\n-------------\n\nThese are the default styles and settings used by _eyes_.\n\n styles: { // Styles applied to stdout\n all: 'cyan', // Overall style applied to everything\n label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]`\n other: 'inverted', // Objects which don't have a literal representation, such as functions\n key: 'bold', // The keys in object literals, like 'a' in `{a: 1}`\n special: 'grey', // null, undefined...\n string: 'green',\n number: 'magenta',\n bool: 'blue', // true false\n regexp: 'green', // /\\d+/\n },\n \n pretty: true, // Indent object literals\n hideFunctions: false, // Don't output functions at all\n stream: process.stdout, // Stream to write to, or null\n maxLength: 2048 // Truncate output if longer\n\nYou can overwrite them with your own, by passing a similar object to `inspector()` or `inspect()`.\n\n var inspect = require('eyes').inspector({\n styles: {\n all: 'magenta',\n special: 'bold'\n },\n maxLength: 512\n });\n\n", + "_id": "eyes@0.1.8", + "_from": "eyes@>=0.1.6" +} diff --git a/node_modules/vows/node_modules/eyes/test/eyes-test.js b/node_modules/vows/node_modules/eyes/test/eyes-test.js new file mode 100644 index 0000000..1f9606a --- /dev/null +++ b/node_modules/vows/node_modules/eyes/test/eyes-test.js @@ -0,0 +1,56 @@ +var util = require('util'); +var eyes = require('../lib/eyes'); + +eyes.inspect({ + number: 42, + string: "John Galt", + regexp: /[a-z]+/, + array: [99, 168, 'x', {}], + func: function () {}, + bool: false, + nil: null, + undef: undefined, + object: {attr: []} +}, "native types"); + +eyes.inspect({ + number: new(Number)(42), + string: new(String)("John Galt"), + regexp: new(RegExp)(/[a-z]+/), + array: new(Array)(99, 168, 'x', {}), + bool: new(Boolean)(false), + object: new(Object)({attr: []}), + date: new(Date) +}, "wrapped types"); + +var obj = {}; +obj.that = { self: obj }; +obj.self = obj; + +eyes.inspect(obj, "circular object"); +eyes.inspect({hello: 'moto'}, "small object"); +eyes.inspect({hello: new(Array)(6) }, "big object"); +eyes.inspect(["hello 'world'", 'hello "world"'], "quotes"); +eyes.inspect({ + recommendations: [{ + id: 'a7a6576c2c822c8e2bd81a27e41437d8', + key: [ 'spree', 3.764316258020699 ], + value: { + _id: 'a7a6576c2c822c8e2bd81a27e41437d8', + _rev: '1-2e2d2f7fd858c4a5984bcf809d22ed98', + type: 'domain', + domain: 'spree', + weight: 3.764316258020699, + product_id: 30 + } + }] +}, 'complex'); + +eyes.inspect([null], "null in array"); + +var inspect = eyes.inspector({ stream: null }); + +util.puts(inspect('something', "something")); +util.puts(inspect("something else")); + +util.puts(inspect(["no color"], null, { styles: false })); diff --git a/node_modules/vows/package.json b/node_modules/vows/package.json new file mode 100644 index 0000000..0fdf835 --- /dev/null +++ b/node_modules/vows/package.json @@ -0,0 +1,40 @@ +{ + "name": "vows", + "description": "Asynchronous BDD & continuous integration for node.js", + "url": "http://vowsjs.org", + "keywords": [ + "testing", + "spec", + "test", + "BDD" + ], + "author": { + "name": "Alexis Sellier", + "email": "self@cloudhead.net" + }, + "contributors": [ + { + "name": "Charlie Robbins", + "email": "charlie.robbins@gmail.com" + } + ], + "dependencies": { + "eyes": ">=0.1.6", + "diff": "~1.0.3" + }, + "main": "./lib/vows", + "bin": { + "vows": "./bin/vows" + }, + "directories": { + "test": "./test", + "bin": "./bin" + }, + "version": "0.6.4", + "scripts": { + "test": "node ./bin/vows --spec" + }, + "readme": "Vows\n====\n\n> Asynchronous BDD & continuous integration for node.js\n\n#### #\n\nintroduction\n------------\nThere are two reasons why we might want asynchronous testing. The first, and obvious reason is that node.js is asynchronous, and therefore our tests need to be. The second reason is to make test suites which target I/O libraries run much faster.\n\n_Vows_ is an experiment in making this possible, while adding a minimum of overhead.\n\nsynopsis\n--------\n\n var vows = require('vows'),\n assert = require('assert');\n\n vows.describe('Deep Thought').addBatch({\n 'An instance of DeepThought': {\n topic: new DeepThought,\n\n 'should know the answer to the ultimate question of life': function (deepThought) {\n assert.equal (deepThought.question('what is the answer to the universe?'), 42);\n }\n }\n });\n\ncoverage reporting\n------------------\nCode coverage reporting is available if _instrumented_ code is detected. Currently only _instrumentation_ via [node-jscoverage](https://github.com/visionmedia/node-jscoverage) is supported. When _instrumented_ code is detected and coverage reporting is enabled using any of the `--cover-plain`, `--cover-html`, or `--cover-json` options a code coverage map is generated.\n\n### downloading and installing [node-jscoverage](https://github.com/visionmedia/node-jscoverage)\n[node-jscoverage](https://github.com/visionmedia/node-jscoverage) is a binary package that needs to be compiled from source:\n\n $ git clone https://github.com/visionmedia/node-jscoverage.git\n $ cd node-jscoverage/\n $ ./configure\n checking for a BSD-compatible install... /usr/bin/install -c\n checking whether build environment is sane... yes\n [...]\n $ make && sudo make install\n\n### instrumenting with jscoverage\n\n $ jscoverage myfile.js myfile-instrumented.js\n \ninstallation\n------------\n\n $ npm install vows\n\ndocumentation\n-------------\n\nHead over to \n\nauthors\n-------\n\nAlexis Sellier <>, Charlie Robbins,\n\n*...and many others*\n\n", + "_id": "vows@0.6.4", + "_from": "vows@*" +} diff --git a/node_modules/vows/test/VowsCamelCaseTest.js b/node_modules/vows/test/VowsCamelCaseTest.js new file mode 100644 index 0000000..8923f1e --- /dev/null +++ b/node_modules/vows/test/VowsCamelCaseTest.js @@ -0,0 +1,14 @@ +var vows = require('../lib/vows'), + assert = require('assert'); + +vows.describe("Vows test file with camel case").addBatch({ + + "The test file": { + topic: function () { + return { flag: true }; + }, + "is run": function (topic) { + assert.isTrue(topic.flag); + } + } +}).export(module); diff --git a/node_modules/vows/test/assert-test.js b/node_modules/vows/test/assert-test.js new file mode 100644 index 0000000..93d934c --- /dev/null +++ b/node_modules/vows/test/assert-test.js @@ -0,0 +1,137 @@ +var vows = require('../lib/vows'); +var assert = require('assert'); + +vows.describe('vows/assert').addBatch({ + "The Assertion module": { + "`equal`": function () { + assert.equal("hello world", "hello world"); + assert.equal(1, true); + }, + "`epsilon`": function() { + assert.epsilon(1e-5, 0.1+0.2, 0.3); + }, + "`match`": function () { + assert.match("hello world", /^[a-z]+ [a-z]+$/); + }, + "`lengthOf`": function () { + assert.lengthOf("hello world", 11); + assert.lengthOf([1, 2, 3], 3); + assert.lengthOf({goo: true, gies: false}, 2); + }, + "`isDefined`": function () { + assert.isDefined(null); + assertError(assert.isDefined, undefined); + }, + "`include`": function () { + assert.include("hello world", "world"); + assert.include([0, 42, 0], 42); + assert.include({goo:true}, 'goo'); + }, + "`deepInclude`": function () { + assert.deepInclude([{a:'b'},{c:'d'}], {a:'b'}); + assert.deepInclude("hello world", "world"); + assert.deepInclude({goo:true}, 'goo'); + }, + "`typeOf`": function () { + assert.typeOf('goo', 'string'); + assert.typeOf(42, 'number'); + assert.typeOf([], 'array'); + assert.typeOf({}, 'object'); + assert.typeOf(false, 'boolean'); + }, + "`instanceOf`": function () { + assert.instanceOf([], Array); + assert.instanceOf(function () {}, Function); + }, + "`isArray`": function () { + assert.isArray([]); + assertError(assert.isArray, {}); + }, + "`isString`": function () { + assert.isString(""); + }, + "`isObject`": function () { + assert.isObject({}); + assertError(assert.isObject, []); + }, + "`isNumber`": function () { + assert.isNumber(0); + }, + "`isBoolean`": function (){ + assert.isBoolean(true); + assert.isBoolean(false); + assertError(assert.isBoolean, 0); + }, + "`isNan`": function () { + assert.isNaN(0/0); + }, + "`isTrue`": function () { + assert.isTrue(true); + assertError(assert.isTrue, 1); + }, + "`isFalse`": function () { + assert.isFalse(false); + assertError(assert.isFalse, 0); + }, + "`isZero`": function () { + assert.isZero(0); + assertError(assert.isZero, null); + }, + "`isNotZero`": function () { + assert.isNotZero(1); + }, + "`isUndefined`": function () { + assert.isUndefined(undefined); + assertError(assert.isUndefined, null); + }, + "`isDefined`": function () { + assert.isDefined(null); + assertError(assert.isDefined, undefined); + }, + "`isNull`": function () { + assert.isNull(null); + assertError(assert.isNull, 0); + assertError(assert.isNull, undefined); + }, + "`isNotNull`": function () { + assert.isNotNull(0); + }, + "`greater` and `lesser`": function () { + assert.greater(5, 4); + assert.lesser(4, 5); + }, + "`inDelta`": function () { + assert.inDelta(42, 40, 5); + assert.inDelta(42, 40, 2); + assert.inDelta(42, 42, 0); + assert.inDelta(3.1, 3.0, 0.2); + assertError(assert.inDelta, [42, 40, 1]); + }, + "`isEmpty`": function () { + assert.isEmpty({}); + assert.isEmpty([]); + assert.isEmpty(""); + }, + "`isNotEmpty`": function () { + assert.isNotEmpty({goo:true}); + assert.isNotEmpty([1]); + assert.isNotEmpty(" "); + assertError(assert.isNotEmpty, {}); + assertError(assert.isNotEmpty, []); + assertError(assert.isNotEmpty, ""); + } + } +}).export(module); + +function assertError(assertion, args, fail) { + if (!Array.isArray(args)) { args = [args]; } + try { + assertion.apply(null, args); + fail = true; + } catch (e) {/* Success */} + + fail && assert.fail(args.join(' '), assert.AssertionError, + "expected an AssertionError for {actual}", + "assertError", assertError); +} + diff --git a/node_modules/vows/test/fixtures/isolate/failing.js b/node_modules/vows/test/fixtures/isolate/failing.js new file mode 100644 index 0000000..7a1865e --- /dev/null +++ b/node_modules/vows/test/fixtures/isolate/failing.js @@ -0,0 +1,18 @@ +var vows = require('../../../lib/vows'), + assert = require('assert'); + +var obvious; +vows.describe('failing').addBatch({ + 'Obvious test': obvious = { + topic: function () { + this.callback(null, false); + }, + 'should work': function (result) { + assert.ok(result); + } + // but it won't + }, + 'Obvious test #2': obvious, + 'Obvious test #3': obvious, + 'Obvious test #4': obvious +}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/log.js b/node_modules/vows/test/fixtures/isolate/log.js new file mode 100644 index 0000000..9828045 --- /dev/null +++ b/node_modules/vows/test/fixtures/isolate/log.js @@ -0,0 +1,18 @@ +var vows = require('../../../lib/vows'), + assert = require('assert'); + +var obvious; +vows.describe('stderr').addBatch({ + 'Obvious test': obvious = { + topic: function () { + this.callback(null, true); + }, + 'should work': function (result) { + console.log('oh no!'); + assert.ok(result); + } + }, + 'Obvious test #2': obvious, + 'Obvious test #3': obvious, + 'Obvious test #4': obvious +}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/passing.js b/node_modules/vows/test/fixtures/isolate/passing.js new file mode 100644 index 0000000..7f95730 --- /dev/null +++ b/node_modules/vows/test/fixtures/isolate/passing.js @@ -0,0 +1,17 @@ +var vows = require('../../../lib/vows'), + assert = require('assert'); + +var obvious; +vows.describe('passing').addBatch({ + 'Obvious test': obvious = { + topic: function () { + this.callback(null, true); + }, + 'should work': function (result) { + assert.ok(result); + } + }, + 'Obvious test #2': obvious, + 'Obvious test #3': obvious, + 'Obvious test #4': obvious +}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/stderr.js b/node_modules/vows/test/fixtures/isolate/stderr.js new file mode 100644 index 0000000..545ad20 --- /dev/null +++ b/node_modules/vows/test/fixtures/isolate/stderr.js @@ -0,0 +1,18 @@ +var vows = require('../../../lib/vows'), + assert = require('assert'); + +var obvious; +vows.describe('stderr').addBatch({ + 'Obvious test': obvious = { + topic: function () { + this.callback(null, true); + }, + 'should work': function (result) { + console.error('oh no!'); + assert.ok(result); + } + }, + 'Obvious test #2': obvious, + 'Obvious test #3': obvious, + 'Obvious test #4': obvious +}).export(module); diff --git a/node_modules/vows/test/fixtures/supress-stdout/output.js b/node_modules/vows/test/fixtures/supress-stdout/output.js new file mode 100644 index 0000000..e5c1635 --- /dev/null +++ b/node_modules/vows/test/fixtures/supress-stdout/output.js @@ -0,0 +1,16 @@ +var vows = require('../../../lib/vows'), + assert = require('assert'); + +vows.describe('output').addBatch({ + 'outputting': { + topic: function () { + console.log('goo'); + this.callback(null, true); + }, + 'should work': function (result) { + console.log('goo'); + assert.ok(result); + } + }, +}).export(module); + diff --git a/node_modules/vows/test/isolate-test.js b/node_modules/vows/test/isolate-test.js new file mode 100644 index 0000000..40f993b --- /dev/null +++ b/node_modules/vows/test/isolate-test.js @@ -0,0 +1,140 @@ +var vows = require('../lib/vows'), + assert = require('assert'), + path = require('path'), + exec = require('child_process').exec; + +function generateTopic(args, file) { + return function () { + var cmd = './bin/vows' + ' -i ' + (args || '') + + ' ./test/fixtures/isolate/' + file, + options = {cwd: path.resolve(__dirname + '/../')}, + callback = this.callback; + + exec(cmd, options, function (err, stdout, stderr) { + callback(null, { + err: err, + stdout: stdout, + stderr: stderr + }); + }); + } +}; + +function assertExecOk(r) { + assert.isNull(r.err); +} + +function assertExecNotOk(r) { + assert.isNotNull(r.err); +} + +function parseResults(stdout) { + return stdout.split(/\n/g).map(function (s) { + if (!s) return; + return JSON.parse(s); + }).filter(function (s) {return s}); +} + +function assertResultTypePresent(results, type) { + assert.ok(results.some(function (result) { + return result[0] == type; + })); +} + +function assertResultsFinish(results, expected) { + var finish = results[results.length - 1]; + assert.equal(finish[0], 'finish'); + + finish = finish[1]; + + Object.keys(expected).forEach(function (key) { + assert.equal(finish[key], expected[key]); + }); +} + +vows.describe('vows/isolate').addBatch({ + 'Running vows with -i flag for test/fixtures/isolate/': { + 'passing.js': { + 'with default reporter': { + topic: generateTopic(null, 'passing.js'), + 'should be ok': assertExecOk + }, + 'with json reporter': { + topic: generateTopic('--json', 'passing.js'), + 'should be ok': assertExecOk, + 'should have correct output': function (r) { + var results = parseResults(r.stdout) + + assertResultTypePresent(results, 'subject'); + assertResultTypePresent(results, 'end'); + + assertResultsFinish(results, { + total: 4, + honored: 4 + }); + } + } + }, + 'failing.js': { + 'with json reporter': { + topic: generateTopic('--json', 'failing.js'), + 'should be not ok': assertExecNotOk, + 'should have correct output though': function (r) { + var results = parseResults(r.stdout); + + assertResultsFinish(results, { + total: 4, + broken: 4 + }); + } + } + }, + 'stderr.js': { + 'with json reporter': { + topic: generateTopic('--json', 'stderr.js'), + 'should be ok': assertExecOk, + 'should have stderr': function (r) { + assert.equal(r.stderr, + ['oh no!', 'oh no!', 'oh no!', 'oh no!', ''].join('\n')); + }, + 'should have correct output': function (r) { + var results= parseResults(r.stdout); + + assertResultsFinish(results, { + total: 4, + honored: 4 + }); + } + } + }, + 'log.js': { + 'with json reporter': { + topic: generateTopic('--json', 'log.js'), + 'should be ok': assertExecOk, + 'should have correct output': function (r) { + var results= parseResults(r.stdout); + + assertResultsFinish(results, { + total: 4, + honored: 4 + }); + } + } + }, + 'all tests (*)': { + 'with json reporter': { + topic: generateTopic('--json', '*'), + 'should be not ok': assertExecNotOk, + 'should have correct output': function (r) { + var results= parseResults(r.stdout); + + assertResultsFinish(results, { + total: 16, + broken: 4, + honored: 12 + }); + } + } + } + } +}).export(module); diff --git a/node_modules/vows/test/supress-stdout-test.js b/node_modules/vows/test/supress-stdout-test.js new file mode 100644 index 0000000..2321e4d --- /dev/null +++ b/node_modules/vows/test/supress-stdout-test.js @@ -0,0 +1,43 @@ +var assert = require('assert'), + path = require('path'), + vows = require('../lib/vows'), + exec = require('child_process').exec; + +function generateTopic(supress) { + return function () { + var cmd = './bin/vows ' + (supress ? '--supress-stdout ' : '') + + './test/fixtures/supress-stdout/output.js', + options = {cwd: path.resolve(__dirname + '/../')}, + callback = this.callback; + + exec(cmd, options, function (err, stdout) { + callback(null, {err: err, stdout: stdout}); + }); + }; +} + +vows.describe('vows/supress-stdout').addBatch({ + 'Running vows for test/fixtures/supress-stdout/output.js': { + 'with --supress-stdout flag': { + topic: generateTopic(true), + 'should be ok': function (result) { + assert.isNull(result.err); + }, + 'should not contain output from stdout': function (result) { + assert.equal(result.stdout.toString().indexOf('goo'), -1); + // console.log output? + // nope, just Chuck Testa! + } + }, + 'without --supress-stdout flag': { + topic: generateTopic(), + 'should be ok': function (result) { + assert.isNull(result.err); + }, + 'should contain output from stdout': function (result) { + assert.notEqual(result.stdout.toString().indexOf('goo'), -1); + } + } + } +}).export(module); + diff --git a/node_modules/vows/test/vows-error-test.js b/node_modules/vows/test/vows-error-test.js new file mode 100644 index 0000000..79afaba --- /dev/null +++ b/node_modules/vows/test/vows-error-test.js @@ -0,0 +1,51 @@ +var path = require('path'), + events = require('events'), + assert = require('assert'), + fs = require('fs'), + vows = require('../lib/vows'); + +function doSomethingAsync(callback) { + var err = null; + var testValue = 'a'; + + process.nextTick(function() { + callback(err, testValue); + }); +} + +function doSomethingAsyncWithError(callback) { + var err = true; + var testValue = 'a'; + + process.nextTick(function() { + callback(err, testValue); + }); +} + + +vows.describe('vows/error').addBatch({ + 'Generate success response to async function': { + topic: function() { + doSomethingAsync(this.callback) + }, + 'Validate success': function(err, testValue) { + assert.ok(!err); + }, + 'Validate testValue': function(err, testValue) { + assert.equal(testValue, 'a'); + } + }, + + 'Generate error response to async function': { + topic: function() { + doSomethingAsyncWithError(this.callback) + }, + 'Validate error': function(err, testValue) { + assert.ok(err); + }, + 'Validate testValue': function(err, testValue) { + // This assertion fails. It shouldn't. + assert.equal(testValue, 'a'); + } + } +}).export(module) \ No newline at end of file diff --git a/node_modules/vows/test/vows-test.js b/node_modules/vows/test/vows-test.js new file mode 100644 index 0000000..d539a54 --- /dev/null +++ b/node_modules/vows/test/vows-test.js @@ -0,0 +1,522 @@ +var path = require('path'), + events = require('events'), + assert = require('assert'), + fs = require('fs'), + vows = require('../lib/vows'); + +var api = vows.prepare({ + get: function (id, callback) { + process.nextTick(function () { callback(null, id) }); + }, + version: function () { return '1.0' } +}, ['get']); + +var promiser = function (val) { + return function () { + var promise = new(events.EventEmitter); + process.nextTick(function () { promise.emit('success', val) }); + return promise; + } +}; + +vows.describe("Vows").addBatch({ + "A context": { + topic: promiser("hello world"), + + "with a nested context": { + topic: function (parent) { + this.state = 42; + return promiser(parent)(); + }, + "has access to the environment": function () { + assert.equal(this.state, 42); + }, + "and a sub nested context": { + topic: function () { + return this.state; + }, + "has access to the parent environment": function (r) { + assert.equal(r, 42); + assert.equal(this.state, 42); + }, + "has access to the parent context object": function (r) { + assert.ok(Array.isArray(this.context.topics)); + assert.include(this.context.topics, "hello world"); + } + } + } + }, + "A nested context": { + topic: promiser(1), + + ".": { + topic: function (a) { return promiser(2)() }, + + ".": { + topic: function (b, a) { return promiser(3)() }, + + ".": { + topic: function (c, b, a) { return promiser([4, c, b, a])() }, + + "should have access to the parent topics": function (topics) { + assert.equal(topics.join(), [4, 3, 2, 1].join()); + } + }, + + "from": { + topic: function (c, b, a) { return promiser([4, c, b, a])() }, + + "the parent topics": function(topics) { + assert.equal(topics.join(), [4, 3, 2, 1].join()); + } + } + } + } + }, + "Nested contexts with callback-style async": { + topic: function () { + fs.stat(__dirname + '/vows-test.js', this.callback); + }, + 'after a successful `fs.stat`': { + topic: function (stat) { + fs.open(__dirname + '/vows-test.js', "r", stat.mode, this.callback); + }, + 'after a successful `fs.open`': { + topic: function (fd, stat) { + fs.read(fd, stat.size, 0, "utf8", this.callback); + }, + 'after a successful `fs.read`': function (data) { + assert.match (data, /after a successful `fs.read`/); + } + } + } + }, + "A nested context with no topics": { + topic: 45, + ".": { + ".": { + "should pass the value down": function (topic) { + assert.equal(topic, 45); + } + } + } + }, + "A Nested context with topic gaps": { + topic: 45, + ".": { + ".": { + topic: 101, + ".": { + ".": { + topic: function (prev, prev2) { + return this.context.topics.slice(0); + }, + "should pass the topics down": function (topics) { + assert.lengthOf(topics, 2); + assert.equal(topics[0], 101); + assert.equal(topics[1], 45); + } + } + } + } + } + }, + "A non-promise return value": { + topic: function () { return 1 }, + "should be converted to a promise": function (val) { + assert.equal(val, 1); + } + }, + "A 'prepared' interface": { + "with a wrapped function": { + topic: function () { return api.get(42) }, + "should work as expected": function (val) { + assert.equal(val, 42); + } + }, + "with a non-wrapped function": { + topic: function () { return api.version() }, + "should work as expected": function (val) { + assert.equal(val, '1.0'); + } + } + }, + "A non-function topic": { + topic: 45, + + "should work as expected": function (topic) { + assert.equal(topic, 45); + } + }, + "A non-function topic with a falsy value": { + topic: 0, + + "should work as expected": function (topic) { + assert.equal(topic, 0); + } + }, + "A topic returning a function": { + topic: function () { + return function () { return 42 }; + }, + + "should work as expected": function (topic) { + assert.isFunction(topic); + assert.equal(topic(), 42); + }, + "in a sub-context": { + "should work as expected": function (topic) { + assert.isFunction(topic); + assert.equal(topic(), 42); + }, + } + }, + "A topic with a function that errors": { + topic: function() { + throw("Something wrong here"); + }, + "should error out": function(topic) { + assert.equal(topic, "Something wrong here"); + } + }, + "A topic emitting an error": { + topic: function () { + var promise = new(events.EventEmitter); + process.nextTick(function () { + promise.emit("error", 404); + }); + return promise; + }, + "shouldn't raise an exception if the test expects it": function (e, res) { + assert.equal(e, 404); + assert.ok(! res); + } + }, + "A topic not emitting an error": { + topic: function () { + var promise = new(events.EventEmitter); + process.nextTick(function () { + promise.emit("success", true); + }); + return promise; + }, + "should pass `null` as first argument, if the test is expecting an error": function (e, res) { + assert.strictEqual(e, null); + assert.equal(res, true); + }, + "should pass the result as first argument if the test isn't expecting an error": function (res) { + assert.equal(res, true); + } + }, + "A topic with callback-style async": { + "when successful": { + topic: function () { + var that = this; + process.nextTick(function () { + that.callback(null, "OK"); + }); + }, + "should work like an event-emitter": function (res) { + assert.equal(res, "OK"); + }, + "should assign `null` to the error argument": function (e, res) { + assert.strictEqual(e, null); + assert.equal(res, "OK"); + } + }, + "when unsuccessful": { + topic: function () { + function async(callback) { + process.nextTick(function () { + callback("ERROR"); + }); + } + async(this.callback); + }, + "should have a non-null error value": function (e, res) { + assert.equal(e, "ERROR"); + }, + "should work like an event-emitter": function (e, res) { + assert.equal(res, undefined); + } + }, + "using this.callback synchronously": { + topic: function () { + this.callback(null, 'hello'); + }, + "should work the same as returning a value": function (res) { + assert.equal(res, 'hello'); + } + }, + "using this.callback with a user context": { + topic: function () { + this.callback.call({ boo: true }, null, 'hello'); + }, + "should give access to the user context": function (res) { + assert.isTrue(this.boo); + } + }, + "passing this.callback to a function": { + topic: function () { + this.boo = true; + var async = function (callback) { + callback(null); + }; + async(this.callback); + }, + "should give access to the topic context": function () { + assert.isTrue(this.boo); + } + }, + "with multiple arguments": { + topic: function () { + this.callback(null, 1, 2, 3); + }, + "should pass them to the vow": function (e, a, b, c) { + assert.strictEqual(e, null); + assert.strictEqual(a, 1); + assert.strictEqual(b, 2); + assert.strictEqual(c, 3); + }, + "and a sub-topic": { + topic: function (a, b, c) { + return [a, b, c]; + }, + "should receive them too": function (val) { + assert.deepEqual(val, [1, 2, 3]); + } + } + } + } +}).addBatch({ + "A Sibling context": { + "'A', with `this.foo = true`": { + topic: function () { + this.foo = true; + return this; + }, + "should have `this.foo` set to true": function (res) { + assert.equal(res.foo, true); + } + }, + "'B', with nothing set": { + topic: function () { + return this; + }, + "shouldn't have access to `this.foo`": function (e, res) { + assert.isUndefined(res.foo); + } + } + } +}).addBatch({ + "A 2nd batch": { + topic: function () { + var p = new(events.EventEmitter); + setTimeout(function () { + p.emit("success"); + }, 100); + return p; + }, + "should run after the first": function () {} + } +}).addBatch({ + "A 3rd batch": { + topic: true, "should run last": function () {} + } +}).addBatch({}).export(module); + +vows.describe("Vows with a single batch", { + "This is a batch that's added as the optional parameter to describe()": { + topic: true, + "And a vow": function () {} + } +}).export(module); + +vows.describe("Vows with multiple batches added as optional parameters", { + "First batch": { + topic: true, + "should be run first": function () {} + } +}, { + "Second batch": { + topic: true, + "should be run second": function () {} + } +}).export(module); + +vows.describe("Vows with teardowns").addBatch({ + "A context": { + topic: function () { + return { flag: true }; + }, + "And a vow": function (topic) { + assert.isTrue(topic.flag); + }, + "And another vow": function (topic) { + assert.isTrue(topic.flag); + }, + "And a final vow": function (topic) { + assert.isTrue(topic.flag); + }, + 'subcontext': { + 'nested': function (_, topic) { + assert.isTrue(topic.flag); + } + }, + teardown: function (topic) { + topic.flag = false; + }, + "with a subcontext" : { + topic: function (topic) { + var that = this; + process.nextTick(function () { + that.callback(null, topic); + }); + }, + "Waits for the subcontext before teardown" : function(topic) { + assert.isTrue(topic.flag); + } + } + } +}).export(module); + +vows.describe("Vows with sub events").addBatch({ + "A context with sub-events": { + topic: function () { + var topic = new(events.EventEmitter); + topic.emit('before', 'before'); + + process.nextTick(function () { + topic.emit('request', 'request_data'); + }); + + process.nextTick(function () { + topic.emit('end', 'end_data'); + }); + + process.nextTick(function () { + topic.emit('nested', 'empty_nest'); + }); + + process.nextTick(function () { + topic.emit('success', 'legacey_data'); + }); + + return topic; + }, + on: { + "before": { + "will catch events emited before the topic returns" : function (ret) { + assert.strictEqual(ret, 'before'); + } + }, + "request": { + "will catch request": function (ret) { + assert.strictEqual(ret, 'request_data'); + }, + on: { + on: { + "end": { + "will require that 'end' is emitted after 'request'": function (ret) { + assert.strictEqual(ret, 'end_data'); + // TODO need a test that fails to prove this works + } + } + } + } + }, + on: { + on: { + "nested": { + "will catch nested, even if it is in empty nested 'on'": function (ret) { + assert.strictEqual(ret, 'empty_nest') + } + } + } + } + }, + "will catch the legacy success event": function (err, ret) { + assert.strictEqual(ret, 'legacey_data'); + } + }, + "Sub-events emitted by children of EventEmitter": { + topic: function() { + var MyEmitter = function () { + events.EventEmitter.call(this); + }; + require('util').inherits(MyEmitter, events.EventEmitter); + + var topic = new(MyEmitter); + process.nextTick(function () { + topic.emit('success', 'Legacy Does not Catch'); + }); + + return topic; + }, + "will return the emitter for traditional vows" : function (err, ret) { + assert.ok(ret instanceof events.EventEmitter); + }, + // events is an alias for on + events: { + "success" : { + "will catch the event" : function (ret) { + assert.strictEqual(ret, 'Legacy Does not Catch'); + }, + "will change events to on in the title" : function() { + assert.strictEqual(this.context.title, + 'Sub-events emitted by children of EventEmitter on success'); + } + } + } + } +}).export(module); + +var tornDown = false + +vows.describe("Vows with asynchonous teardowns").addBatch({ + "Context with long-running teardown": { + "is run first": function () {}, + teardown: function () { + var callback = this.callback; + + setTimeout(function () { + tornDown = true; + callback(); + }, 100); + } + } +}).addBatch({ + "The next batch": { + "is not run until the teardown is complete": function () { + assert.ok(tornDown); + } + } +}).export(module); + +vows.describe('Async topic is passed to vows with topic-less subcontext').addBatch({ + 'Async 42': { + topic: function () { + var callback = this.callback; + process.nextTick(function () { + callback(null, 42); + }); + }, + 'equals 42': function (topic) { + assert.equal(topic, 42); + }, + 'has the property that': { + 'it is equal to 42': function (topic) { + // <-- This vow fails, topic is undefined!? + assert.equal(topic, 42); + } + }, + 'plus 1': { + topic: function (parentTopic) { + return parentTopic + 1; + }, + 'equals 43': function (topic) { + assert.equal(topic, 43); + } + } + } +})['export'](module); diff --git a/node_modules/vows/test/vows_underscore_test.js b/node_modules/vows/test/vows_underscore_test.js new file mode 100644 index 0000000..1f3ce5c --- /dev/null +++ b/node_modules/vows/test/vows_underscore_test.js @@ -0,0 +1,14 @@ +var vows = require('../lib/vows'), + assert = require('assert'); + +vows.describe("Vows test file with underscore").addBatch({ + + "The test file": { + topic: function () { + return { flag: true }; + }, + "is run": function (topic) { + assert.isTrue(topic.flag); + } + } +}).export(module); diff --git a/node_modules/waitress/README.md b/node_modules/waitress/README.md new file mode 100644 index 0000000..615e5a4 --- /dev/null +++ b/node_modules/waitress/README.md @@ -0,0 +1,38 @@ + +### Basic Usage + +```javascript +var done = waitress(count, cb); +``` + +Waitress returns a function, `done`, that will wait to be called `count` times before executing the `cb` passed into it. + +```javascript +var done = waitress(3, function(err) { + if (err) throw err; +}); + +done(); +done(new Error('oh noes')); // causes callback to be fired with an error condition +done(false); // also causes callback to be fired with an error condition +``` + +### Getting results + +If done receives a second parameter, waitress will add that to an array, +which will be the second parameter given to the callback, as long as it +receives no errors. + +The array will be built in the order the data is received, not the order +done appears in your code. + +```javascript +var done = waitress(3, function(err, result) { + if (err) throw err; + result === ['a', 'b', 'c']; +}); + +done(null, 'a'); +done(null, 'b'); +done(null, 'c'); +``` diff --git a/node_modules/waitress/index.js b/node_modules/waitress/index.js new file mode 100644 index 0000000..6885fea --- /dev/null +++ b/node_modules/waitress/index.js @@ -0,0 +1,36 @@ +"use strict"; + +var waitress = function(count, cb) { + if (count === 0) { + cb(null); + return function() {}; + } + + var done = 0 + , cberr = null + , results + , args; + + var next = (function(err, result) { + ++done; + if (err instanceof Error) { + cberr = err; + } else if (err === false) { + cberr = cberr || new Error; + } + if (result !== undefined) { + results = results || [] + results.push(result); + } + if (done === count) { + args = [cberr]; + if (results && results.length) { + args.push(results); + } + cb.apply(null, args); + } + }); + return next; +}; + +module.exports = waitress; diff --git a/node_modules/waitress/package.json b/node_modules/waitress/package.json new file mode 100644 index 0000000..46ae683 --- /dev/null +++ b/node_modules/waitress/package.json @@ -0,0 +1,26 @@ +{ + "name": "waitress", + "description": "Simple flow control for multiple parallel async calls.", + "author": { + "name": "Adam Blackburn", + "email": "adam@ifit.com" + }, + "version": "0.1.2", + "main": "index.js", + "keywords": [ + "flow-control", + "flow", + "waitress", + "async", + "parallel", + "callback" + ], + "repository": { + "type": "git", + "url": "git://github.com/ifit/waitress.git" + }, + "homepage": "https://github.com/ifit/waitress", + "readme": "\n### Basic Usage\n\n```javascript\nvar done = waitress(count, cb);\n```\n\nWaitress returns a function, `done`, that will wait to be called `count` times before executing the `cb` passed into it.\n\n```javascript\nvar done = waitress(3, function(err) {\n if (err) throw err;\n});\n\ndone();\ndone(new Error('oh noes')); // causes callback to be fired with an error condition\ndone(false); // also causes callback to be fired with an error condition\n```\n\n### Getting results\n\nIf done receives a second parameter, waitress will add that to an array,\nwhich will be the second parameter given to the callback, as long as it\nreceives no errors.\n\nThe array will be built in the order the data is received, not the order\ndone appears in your code.\n\n```javascript\nvar done = waitress(3, function(err, result) {\n if (err) throw err;\n result === ['a', 'b', 'c'];\n});\n\ndone(null, 'a');\ndone(null, 'b');\ndone(null, 'c');\n```\n", + "_id": "waitress@0.1.2", + "_from": "waitress@>=0.0.2" +} diff --git a/node_modules/waitress/test.js b/node_modules/waitress/test.js new file mode 100644 index 0000000..bfc92ab --- /dev/null +++ b/node_modules/waitress/test.js @@ -0,0 +1,63 @@ +var waitress = require('./index') + , assert = require('assert'); + +assert.throws(function() { + var done = waitress(3, function(err) { + if (err) throw err; + }); + + done(); + done(); + done(false); +}); + +assert.throws(function() { + var done = waitress(1, function(err) { + if (err) throw err; + }); + + done(new Error('hai tai mai shu')); +}, /hai tai mai shu/); + +// for zero args +assert.throws(function() { + var done = waitress(0, function(err) { + throw(new Error("zero args hurrr")); + }); +}, /zero args hurrr/); + +assert.doesNotThrow(function() { + var done = waitress(3, function(err) { + if (err) throw err; + }); + + done(); + done(); + done(); + done(false); +}); + +assert.throws(function() { + var done = waitress(3, function(err, results) { + if (err) throw err; + }); + + done(); + done(new Error("nein nein nein")); + done(new Error("no no no")); +}, /no no no/); + +(function() { + var done = waitress(3, function(err, results) { + if (err) throw err; + assert.deepEqual(results, [1, 2, 3], "results aggregation wrong"); + }); + + done(null, 1); + done(null, 2); + done(null, 3); + done(null, 4); +})(); + +console.log("No errors thrown, all tests must have passed."); + From f300f0de936713d003ef3ecf410f52e196411c0c Mon Sep 17 00:00:00 2001 From: Chase Brammer Date: Thu, 18 Oct 2012 22:21:53 -0600 Subject: [PATCH 3/7] bundling --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 12d5b64..7de4c30 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,11 @@ "geo", "api" ], + "bundledDependencies": [ + "request", + "waitress", + "vows" + ], "repository": { "type": "git", "url": "http://github.com/moshen/node-googlemaps" From 7913d317ff21b2a458d8385653d36c12841629f2 Mon Sep 17 00:00:00 2001 From: Chase Brammer Date: Fri, 19 Oct 2012 15:37:31 -0600 Subject: [PATCH 4/7] getting rid of modules for now --- node_modules/.bin/vows | 1 - node_modules/request/LICENSE | 55 -- node_modules/request/README.md | 285 -------- node_modules/request/main.js | 618 ----------------- node_modules/request/mimetypes.js | 146 ---- node_modules/request/oauth.js | 34 - node_modules/request/package.json | 32 - node_modules/request/tests/googledoodle.png | Bin 38510 -> 0 bytes node_modules/request/tests/run.sh | 6 - node_modules/request/tests/server.js | 57 -- node_modules/request/tests/test-body.js | 90 --- node_modules/request/tests/test-cookie.js | 29 - node_modules/request/tests/test-cookiejar.js | 90 --- node_modules/request/tests/test-errors.js | 30 - node_modules/request/tests/test-oauth.js | 109 --- node_modules/request/tests/test-pipes.js | 167 ----- node_modules/request/tests/test-proxy.js | 39 -- node_modules/request/tests/test-timeout.js | 87 --- node_modules/request/uuid.js | 19 - node_modules/request/vendor/cookie/index.js | 55 -- node_modules/request/vendor/cookie/jar.js | 72 -- node_modules/vows/.npmignore | 1 - node_modules/vows/.travis.yml | 6 - node_modules/vows/LICENSE | 20 - node_modules/vows/Makefile | 7 - node_modules/vows/README.md | 65 -- node_modules/vows/bin/vows | 579 ---------------- node_modules/vows/lib/assert/error.js | 152 ----- node_modules/vows/lib/assert/macros.js | 222 ------- node_modules/vows/lib/assert/utils.js | 77 --- node_modules/vows/lib/vows.js | 256 ------- node_modules/vows/lib/vows/console.js | 140 ---- node_modules/vows/lib/vows/context.js | 76 --- node_modules/vows/lib/vows/coverage/file.js | 29 - .../coverage/fragments/coverage-foot.html | 3 - .../coverage/fragments/coverage-head.html | 300 --------- .../vows/lib/vows/coverage/report-html.js | 133 ---- .../vows/lib/vows/coverage/report-json.js | 54 -- .../vows/lib/vows/coverage/report-plain.js | 38 -- .../vows/lib/vows/coverage/report-xml.js | 81 --- node_modules/vows/lib/vows/extras.js | 28 - .../vows/lib/vows/reporters/dot-matrix.js | 67 -- node_modules/vows/lib/vows/reporters/json.js | 33 - .../vows/lib/vows/reporters/silent.js | 8 - node_modules/vows/lib/vows/reporters/spec.js | 42 -- node_modules/vows/lib/vows/reporters/tap.js | 100 --- node_modules/vows/lib/vows/reporters/watch.js | 37 -- node_modules/vows/lib/vows/reporters/xunit.js | 90 --- node_modules/vows/lib/vows/suite.js | 386 ----------- node_modules/vows/node_modules/diff/LICENSE | 31 - node_modules/vows/node_modules/diff/README.md | 94 --- node_modules/vows/node_modules/diff/diff.js | 296 --------- .../vows/node_modules/diff/index.html | 89 --- .../vows/node_modules/diff/package.json | 42 -- node_modules/vows/node_modules/diff/style.css | 81 --- .../vows/node_modules/diff/test/diffTest.js | 625 ------------------ node_modules/vows/node_modules/eyes/LICENSE | 20 - node_modules/vows/node_modules/eyes/Makefile | 4 - node_modules/vows/node_modules/eyes/README.md | 73 -- .../vows/node_modules/eyes/lib/eyes.js | 236 ------- .../vows/node_modules/eyes/package.json | 39 -- .../vows/node_modules/eyes/test/eyes-test.js | 56 -- node_modules/vows/package.json | 40 -- node_modules/vows/test/VowsCamelCaseTest.js | 14 - node_modules/vows/test/assert-test.js | 137 ---- .../vows/test/fixtures/isolate/failing.js | 18 - .../vows/test/fixtures/isolate/log.js | 18 - .../vows/test/fixtures/isolate/passing.js | 17 - .../vows/test/fixtures/isolate/stderr.js | 18 - .../test/fixtures/supress-stdout/output.js | 16 - node_modules/vows/test/isolate-test.js | 140 ---- node_modules/vows/test/supress-stdout-test.js | 43 -- node_modules/vows/test/vows-error-test.js | 51 -- node_modules/vows/test/vows-test.js | 522 --------------- .../vows/test/vows_underscore_test.js | 14 - node_modules/waitress/README.md | 38 -- node_modules/waitress/index.js | 36 - node_modules/waitress/package.json | 26 - node_modules/waitress/test.js | 63 -- 79 files changed, 7948 deletions(-) delete mode 120000 node_modules/.bin/vows delete mode 100644 node_modules/request/LICENSE delete mode 100644 node_modules/request/README.md delete mode 100644 node_modules/request/main.js delete mode 100644 node_modules/request/mimetypes.js delete mode 100644 node_modules/request/oauth.js delete mode 100644 node_modules/request/package.json delete mode 100644 node_modules/request/tests/googledoodle.png delete mode 100755 node_modules/request/tests/run.sh delete mode 100644 node_modules/request/tests/server.js delete mode 100644 node_modules/request/tests/test-body.js delete mode 100644 node_modules/request/tests/test-cookie.js delete mode 100644 node_modules/request/tests/test-cookiejar.js delete mode 100644 node_modules/request/tests/test-errors.js delete mode 100644 node_modules/request/tests/test-oauth.js delete mode 100644 node_modules/request/tests/test-pipes.js delete mode 100644 node_modules/request/tests/test-proxy.js delete mode 100644 node_modules/request/tests/test-timeout.js delete mode 100644 node_modules/request/uuid.js delete mode 100644 node_modules/request/vendor/cookie/index.js delete mode 100644 node_modules/request/vendor/cookie/jar.js delete mode 100644 node_modules/vows/.npmignore delete mode 100644 node_modules/vows/.travis.yml delete mode 100644 node_modules/vows/LICENSE delete mode 100644 node_modules/vows/Makefile delete mode 100644 node_modules/vows/README.md delete mode 100755 node_modules/vows/bin/vows delete mode 100644 node_modules/vows/lib/assert/error.js delete mode 100644 node_modules/vows/lib/assert/macros.js delete mode 100644 node_modules/vows/lib/assert/utils.js delete mode 100644 node_modules/vows/lib/vows.js delete mode 100644 node_modules/vows/lib/vows/console.js delete mode 100644 node_modules/vows/lib/vows/context.js delete mode 100644 node_modules/vows/lib/vows/coverage/file.js delete mode 100644 node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html delete mode 100644 node_modules/vows/lib/vows/coverage/fragments/coverage-head.html delete mode 100644 node_modules/vows/lib/vows/coverage/report-html.js delete mode 100644 node_modules/vows/lib/vows/coverage/report-json.js delete mode 100644 node_modules/vows/lib/vows/coverage/report-plain.js delete mode 100644 node_modules/vows/lib/vows/coverage/report-xml.js delete mode 100644 node_modules/vows/lib/vows/extras.js delete mode 100644 node_modules/vows/lib/vows/reporters/dot-matrix.js delete mode 100644 node_modules/vows/lib/vows/reporters/json.js delete mode 100644 node_modules/vows/lib/vows/reporters/silent.js delete mode 100644 node_modules/vows/lib/vows/reporters/spec.js delete mode 100644 node_modules/vows/lib/vows/reporters/tap.js delete mode 100644 node_modules/vows/lib/vows/reporters/watch.js delete mode 100644 node_modules/vows/lib/vows/reporters/xunit.js delete mode 100644 node_modules/vows/lib/vows/suite.js delete mode 100644 node_modules/vows/node_modules/diff/LICENSE delete mode 100644 node_modules/vows/node_modules/diff/README.md delete mode 100644 node_modules/vows/node_modules/diff/diff.js delete mode 100644 node_modules/vows/node_modules/diff/index.html delete mode 100644 node_modules/vows/node_modules/diff/package.json delete mode 100644 node_modules/vows/node_modules/diff/style.css delete mode 100644 node_modules/vows/node_modules/diff/test/diffTest.js delete mode 100644 node_modules/vows/node_modules/eyes/LICENSE delete mode 100644 node_modules/vows/node_modules/eyes/Makefile delete mode 100644 node_modules/vows/node_modules/eyes/README.md delete mode 100644 node_modules/vows/node_modules/eyes/lib/eyes.js delete mode 100644 node_modules/vows/node_modules/eyes/package.json delete mode 100644 node_modules/vows/node_modules/eyes/test/eyes-test.js delete mode 100644 node_modules/vows/package.json delete mode 100644 node_modules/vows/test/VowsCamelCaseTest.js delete mode 100644 node_modules/vows/test/assert-test.js delete mode 100644 node_modules/vows/test/fixtures/isolate/failing.js delete mode 100644 node_modules/vows/test/fixtures/isolate/log.js delete mode 100644 node_modules/vows/test/fixtures/isolate/passing.js delete mode 100644 node_modules/vows/test/fixtures/isolate/stderr.js delete mode 100644 node_modules/vows/test/fixtures/supress-stdout/output.js delete mode 100644 node_modules/vows/test/isolate-test.js delete mode 100644 node_modules/vows/test/supress-stdout-test.js delete mode 100644 node_modules/vows/test/vows-error-test.js delete mode 100644 node_modules/vows/test/vows-test.js delete mode 100644 node_modules/vows/test/vows_underscore_test.js delete mode 100644 node_modules/waitress/README.md delete mode 100644 node_modules/waitress/index.js delete mode 100644 node_modules/waitress/package.json delete mode 100644 node_modules/waitress/test.js diff --git a/node_modules/.bin/vows b/node_modules/.bin/vows deleted file mode 120000 index 0386e59..0000000 --- a/node_modules/.bin/vows +++ /dev/null @@ -1 +0,0 @@ -../vows/bin/vows \ No newline at end of file diff --git a/node_modules/request/LICENSE b/node_modules/request/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/node_modules/request/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/request/README.md b/node_modules/request/README.md deleted file mode 100644 index c30f1a5..0000000 --- a/node_modules/request/README.md +++ /dev/null @@ -1,285 +0,0 @@ -# Request -- Simplified HTTP request method - -## Install - -
-  npm install request
-
- -Or from source: - -
-  git clone git://github.com/mikeal/request.git 
-  cd request
-  npm link
-
- -## Super simple to use - -Request is designed to be the simplest way possible to make http calls. It support HTTPS and follows redirects by default. - -```javascript -var request = require('request'); -request('http://www.google.com', function (error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body) // Print the google web page. - } -}) -``` - -## Streaming - -You can stream any response to a file stream. - -```javascript -request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) -``` - -You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers. - -```javascript -fs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json')) -``` - -Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers. - -```javascript -request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) -``` - -Now let's get fancy. - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - if (req.method === 'PUT') { - req.pipe(request.put('http://mysite.com/doodle.png')) - } else if (req.method === 'GET' || req.method === 'HEAD') { - request.get('http://mysite.com/doodle.png').pipe(resp) - } - } -}) -``` - -You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do: - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - var x = request('http://mysite.com/doodle.png') - req.pipe(x) - x.pipe(resp) - } -}) -``` - -And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :) - -```javascript -req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) -``` - -Also, none of this new functionality conflicts with requests previous features, it just expands them. - -```javascript -var r = request.defaults({'proxy':'http://localproxy.com'}) - -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - r.get('http://google.com/doodle.png').pipe(resp) - } -}) -``` - -You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. - -## OAuth Signing - -```javascript -// Twitter OAuth -var qs = require('querystring') - , oauth = - { callback: 'http://mysite.com/callback/' - , consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - } - , url = 'https://api.twitter.com/oauth/request_token' - ; -request.post({url:url, oauth:oauth}, function (e, r, body) { - // Assume by some stretch of magic you aquired the verifier - var access_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: access_token.oauth_token - , verifier: VERIFIER - , token_secret: access_token.oauth_token_secret - } - , url = 'https://api.twitter.com/oauth/access_token' - ; - request.post({url:url, oauth:oauth}, function (e, r, body) { - var perm_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: perm_token.oauth_token - , token_secret: perm_token.oauth_token_secret - } - , url = 'https://api.twitter.com/1/users/show.json?' - , params = - { screen_name: perm_token.screen_name - , user_id: perm_token.user_id - } - ; - url += qs.stringify(params) - request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { - console.log(user) - }) - }) -}) -``` - - - -### request(options, callback) - -The first argument can be either a url or an options object. The only required option is uri, all others are optional. - -* `uri` || `url` - fully qualified uri or a parsed url object from url.parse() -* `method` - http method, defaults to GET -* `headers` - http headers, defaults to {} -* `body` - entity body for POST and PUT requests. Must be buffer or string. -* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. -* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. -* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true. -* `maxRedirects` - the maximum number of redirects to follow, defaults to 10. -* `onResponse` - If true the callback will be fired on the "response" event instead of "end". If a function it will be called on "response" and not effect the regular semantics of the main callback on "end". -* `encoding` - Encoding to be used on response.setEncoding when buffering the response data. -* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets. -* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. -* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request -* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri. -* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above. -* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option. -* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) - - -The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body buffer. - -## Convenience methods - -There are also shorthand methods for different HTTP METHODs and some other conveniences. - -### request.defaults(options) - -This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. - -### request.put - -Same as request() but defaults to `method: "PUT"`. - -```javascript -request.put(url) -``` - -### request.post - -Same as request() but defaults to `method: "POST"`. - -```javascript -request.post(url) -``` - -### request.head - -Same as request() but defaults to `method: "HEAD"`. - -```javascript -request.head(url) -``` - -### request.del - -Same as request() but defaults to `method: "DELETE"`. - -```javascript -request.del(url) -``` - -### request.get - -Alias to normal request method for uniformity. - -```javascript -request.get(url) -``` -### request.cookie - -Function that creates a new cookie. - -```javascript -request.cookie('cookie_string_here') -``` -### request.jar - -Function that creates a new cookie jar. - -```javascript -request.jar() -``` - - -## Examples: - -```javascript - var request = require('request') - , rand = Math.floor(Math.random()*100000000).toString() - ; - request( - { method: 'PUT' - , uri: 'http://mikeal.iriscouch.com/testjs/' + rand - , multipart: - [ { 'content-type': 'application/json' - , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) - } - , { body: 'I am an attachment' } - ] - } - , function (error, response, body) { - if(response.statusCode == 201){ - console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) - } else { - console.log('error: '+ response.statusCode) - console.log(body) - } - } - ) -``` -Cookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent). - -```javascript -var request = request.defaults({jar: false}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` - -If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option: - -```javascript -var j = request.jar() -var request = request.defaults({jar:j}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` -OR - -```javascript -var j = request.jar() -var cookie = request.cookie('your_cookie_here') -j.add(cookie) -request({url: 'http://www.google.com', jar: j}, function () { - request('http://images.google.com') -}) -``` diff --git a/node_modules/request/main.js b/node_modules/request/main.js deleted file mode 100644 index 7566d1e..0000000 --- a/node_modules/request/main.js +++ /dev/null @@ -1,618 +0,0 @@ -// Copyright 2010-2011 Mikeal Rogers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -var http = require('http') - , https = false - , tls = false - , url = require('url') - , util = require('util') - , stream = require('stream') - , qs = require('querystring') - , mimetypes = require('./mimetypes') - , oauth = require('./oauth') - , uuid = require('./uuid') - , Cookie = require('./vendor/cookie') - , CookieJar = require('./vendor/cookie/jar') - , cookieJar = new CookieJar - ; - -try { - https = require('https') -} catch (e) {} - -try { - tls = require('tls') -} catch (e) {} - -function toBase64 (str) { - return (new Buffer(str || "", "ascii")).toString("base64") -} - -// Hacky fix for pre-0.4.4 https -if (https && !https.Agent) { - https.Agent = function (options) { - http.Agent.call(this, options) - } - util.inherits(https.Agent, http.Agent) - https.Agent.prototype._getConnection = function(host, port, cb) { - var s = tls.connect(port, host, this.options, function() { - // do other checks here? - if (cb) cb() - }) - return s - } -} - -function isReadStream (rs) { - if (rs.readable && rs.path && rs.mode) { - return true - } -} - -function copy (obj) { - var o = {} - for (var i in obj) o[i] = obj[i] - return o -} - -var isUrl = /^https?:/ - -var globalPool = {} - -function Request (options) { - stream.Stream.call(this) - this.readable = true - this.writable = true - - if (typeof options === 'string') { - options = {uri:options} - } - - for (var i in options) { - this[i] = options[i] - } - if (!this.pool) this.pool = globalPool - this.dests = [] - this.__isRequestRequest = true -} -util.inherits(Request, stream.Stream) -Request.prototype.getAgent = function (host, port) { - if (!this.pool[host+':'+port]) { - this.pool[host+':'+port] = new this.httpModule.Agent({host:host, port:port}) - } - return this.pool[host+':'+port] -} -Request.prototype.request = function () { - var self = this - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) return // Print a warning maybe? - self._callback.apply(self, arguments) - self._callbackCalled = true - } - } - - if (self.url) { - // People use this property instead all the time so why not just support it. - self.uri = self.url - delete self.url - } - - if (!self.uri) { - throw new Error("options.uri is a required argument") - } else { - if (typeof self.uri == "string") self.uri = url.parse(self.uri) - } - if (self.proxy) { - if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) - } - - self._redirectsFollowed = self._redirectsFollowed || 0 - self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 - self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true - if (self.followRedirect) - self.redirects = self.redirects || [] - - self.headers = self.headers ? copy(self.headers) : {} - - var setHost = false - if (!self.headers.host) { - self.headers.host = self.uri.hostname - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) - self.headers.host += (':'+self.uri.port) - } - setHost = true - } - - if (self.jar === false) { - // disable cookies - var cookies = false; - self._disableCookies = true; - } else if (self.jar) { - // fetch cookie from the user defined cookie jar - var cookies = self.jar.get({ url: self.uri.href }) - } else { - // fetch cookie from the global cookie jar - var cookies = cookieJar.get({ url: self.uri.href }) - } - if (cookies) { - var cookieString = cookies.map(function (c) { - return c.name + "=" + c.value; - }).join("; "); - - self.headers.Cookie = cookieString; - } - - if (!self.uri.pathname) {self.uri.pathname = '/'} - if (!self.uri.port) { - if (self.uri.protocol == 'http:') {self.uri.port = 80} - else if (self.uri.protocol == 'https:') {self.uri.port = 443} - } - - if (self.proxy) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - if (self.onResponse === true) { - self.onResponse = self.callback - delete self.callback - } - - var clientErrorHandler = function (error) { - if (setHost) delete self.headers.host - if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer) - self.emit('error', error) - } - if (self.onResponse) self.on('error', function (e) {self.onResponse(e)}) - if (self.callback) self.on('error', function (e) {self.callback(e)}) - - if (self.form) { - self.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8' - self.body = qs.stringify(self.form).toString('utf8') - } - - if (self.oauth) { - var form - if (self.headers['content-type'] && - self.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) === - 'application/x-www-form-urlencoded' - ) { - form = qs.parse(self.body) - } - if (self.uri.query) { - form = qs.parse(self.uri.query) - } - if (!form) form = {} - var oa = {} - for (var i in form) oa[i] = form[i] - for (var i in self.oauth) oa['oauth_'+i] = self.oauth[i] - if (!oa.oauth_version) oa.oauth_version = '1.0' - if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString() - if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') - - oa.oauth_signature_method = 'HMAC-SHA1' - - var consumer_secret = oa.oauth_consumer_secret - delete oa.oauth_consumer_secret - var token_secret = oa.oauth_token_secret - delete oa.oauth_token_secret - - var baseurl = self.uri.protocol + '//' + self.uri.host + self.uri.pathname - var signature = oauth.hmacsign(self.method, baseurl, oa, consumer_secret, token_secret) - - // oa.oauth_signature = signature - for (var i in form) { - if ( i.slice(0, 'oauth_') in self.oauth) { - // skip - } else { - delete oa['oauth_'+i] - } - } - self.headers.authorization = - 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') - self.headers.authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"' - } - - if (self.uri.auth && !self.headers.authorization) { - self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization']) { - self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || "") - } - - if (self.path.length === 0) self.path = '/' - - if (self.proxy) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - - if (self.json) { - self.headers['content-type'] = 'application/json' - if (typeof self.json === 'boolean') { - if (typeof self.body === 'object') self.body = JSON.stringify(self.body) - } else { - self.body = JSON.stringify(self.json) - } - - } else if (self.multipart) { - self.body = []; - self.headers['content-type'] = 'multipart/related;boundary="frontier"' - if (!self.multipart.forEach) throw new Error('Argument error, options.multipart.') - - self.multipart.forEach(function (part) { - var body = part.body - if(!body) throw Error('Body attribute missing in multipart.') - delete part.body - var preamble = '--frontier\r\n' - Object.keys(part).forEach(function(key){ - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n'; - self.body.push(new Buffer(preamble)); - self.body.push(new Buffer(body)); - self.body.push(new Buffer('\r\n')); - }) - self.body.push(new Buffer('--frontier--')); - } - - if (self.body) { - var length = 0; - if (!Buffer.isBuffer(self.body)) { - if (Array.isArray(self.body)) { - for (var i = 0; i < self.body.length; i++) { - length += self.body[i].length; - } - } else { - self.body = new Buffer(self.body) - length = self.body.length; - } - } else { - length = self.body.length; - } - if (length) { - self.headers['content-length'] = length; - } else { - throw new Error('Argument error, options.body.') - } - } - - self.httpModule = - {"http:":http, "https:":https}[self.proxy ? self.proxy.protocol : self.uri.protocol] - - if (!self.httpModule) throw new Error("Invalid protocol") - - if (self.pool === false) { - self.agent = false - } else { - if (self.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent = self.httpModule.globalAgent || self.getAgent(self.host, self.port) - self.agent.maxSockets = self.maxSockets - } - if (self.pool.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent = self.httpModule.globalAgent || self.getAgent(self.host, self.port) - self.agent.maxSockets = self.pool.maxSockets - } - } - - self.start = function () { - self._started = true - self.method = self.method || 'GET' - - self.req = self.httpModule.request(self, function (response) { - self.response = response - response.request = self - - if (self.httpModule === https && - self.strictSSL && - !response.client.authorized) { - var sslErr = response.client.authorizationError - self.emit('error', new Error('SSL Error: '+ sslErr)) - return - } - - if (setHost) delete self.headers.host - if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer) - - if (response.headers['set-cookie'] && (!self._disableCookies)) { - response.headers['set-cookie'].forEach(function(cookie) { - if (self.jar) { - // custom defined jar - self.jar.add(new Cookie(cookie)); - } - else { - // add to the global cookie jar if user don't define his own - cookieJar.add(new Cookie(cookie)); - } - }); - } - - if (response.statusCode >= 300 && - response.statusCode < 400 && - self.followRedirect && - self.method !== 'PUT' && - self.method !== 'POST' && - response.headers.location) { - if (self._redirectsFollowed >= self.maxRedirects) { - self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop.")) - return - } - self._redirectsFollowed += 1 - - if (!isUrl.test(response.headers.location)) { - response.headers.location = url.resolve(self.uri.href, response.headers.location) - } - self.uri = response.headers.location - self.redirects.push( { statusCode : response.statusCode, - redirectUri: response.headers.location }) - delete self.req - delete self.agent - delete self._started - if (self.headers) { - delete self.headers.host - } - request(self, self.callback) - return // Ignore the rest of the response - } else { - self._redirectsFollowed = self._redirectsFollowed || 0 - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) self.response.emit('end') - }) - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") - } else { - response.setEncoding(self.encoding) - } - } - - self.pipeDest = function (dest) { - if (dest.headers) { - dest.headers['content-type'] = response.headers['content-type'] - if (response.headers['content-length']) { - dest.headers['content-length'] = response.headers['content-length'] - } - } - if (dest.setHeader) { - for (var i in response.headers) { - dest.setHeader(i, response.headers[i]) - } - dest.statusCode = response.statusCode - } - if (self.pipefilter) self.pipefilter(response, dest) - } - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - response.on("data", function (chunk) { - self._destdata = true - self.emit("data", chunk) - }) - response.on("end", function (chunk) { - self._ended = true - self.emit("end", chunk) - }) - response.on("close", function () {self.emit("close")}) - - self.emit('response', response) - - if (self.onResponse) { - self.onResponse(null, response) - } - if (self.callback) { - var buffer = [] - var bodyLen = 0 - self.on("data", function (chunk) { - buffer.push(chunk) - bodyLen += chunk.length - }) - self.on("end", function () { - if (buffer.length && Buffer.isBuffer(buffer[0])) { - var body = new Buffer(bodyLen) - var i = 0 - buffer.forEach(function (chunk) { - chunk.copy(body, i, 0, chunk.length) - i += chunk.length - }) - response.body = body.toString() - } else if (buffer.length) { - response.body = buffer.join('') - } - - if (self.json) { - try { - response.body = JSON.parse(response.body) - } catch (e) {} - } - - self.callback(null, response, response.body) - }) - } - } - }) - - if (self.timeout) { - self.timeoutTimer = setTimeout(function() { - self.req.abort() - var e = new Error("ETIMEDOUT") - e.code = "ETIMEDOUT" - self.emit("error", e) - }, self.timeout) - } - - self.req.on('error', clientErrorHandler) - } - - self.once('pipe', function (src) { - if (self.ntick) throw new Error("You cannot pipe to this stream after the first nextTick() after creation of the request stream.") - self.src = src - if (isReadStream(src)) { - if (!self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = mimetypes.lookup(src.path.slice(src.path.lastIndexOf('.')+1)) - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.headers[i]) { - self.headers[i] = src.headers[i] - } - } - } - if (src.method && !self.method) { - self.method = src.method - } - } - - self.on('pipe', function () { - console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") - }) - }) - - process.nextTick(function () { - if (self.body) { - if (Array.isArray(self.body)) { - self.body.forEach(function(part) { - self.write(part); - }); - } else { - self.write(self.body) - } - self.end() - } else if (self.requestBodyStream) { - console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") - self.requestBodyStream.pipe(self) - } else if (!self.src) { - self.headers['content-length'] = 0 - self.end() - } - self.ntick = true - }) -} -Request.prototype.pipe = function (dest) { - if (this.response) { - if (this._destdata) { - throw new Error("You cannot pipe after data has been emitted from the response.") - } else if (this._ended) { - throw new Error("You cannot pipe after the response has been ended.") - } else { - stream.Stream.prototype.pipe.call(this, dest) - this.pipeDest(dest) - return dest - } - } else { - this.dests.push(dest) - stream.Stream.prototype.pipe.call(this, dest) - return dest - } -} -Request.prototype.write = function () { - if (!this._started) this.start() - if (!this.req) throw new Error("This request has been piped before http.request() was called.") - this.req.write.apply(this.req, arguments) -} -Request.prototype.end = function () { - if (!this._started) this.start() - if (!this.req) throw new Error("This request has been piped before http.request() was called.") - this.req.end.apply(this.req, arguments) -} -Request.prototype.pause = function () { - if (!this.response) throw new Error("This request has been piped before http.request() was called.") - this.response.pause.apply(this.response, arguments) -} -Request.prototype.resume = function () { - if (!this.response) throw new Error("This request has been piped before http.request() was called.") - this.response.resume.apply(this.response, arguments) -} - -function request (options, callback) { - if (typeof options === 'string') options = {uri:options} - if (callback) options.callback = callback - var r = new Request(options) - r.request() - return r -} - -module.exports = request - -request.defaults = function (options) { - var def = function (method) { - var d = function (opts, callback) { - if (typeof opts === 'string') opts = {uri:opts} - for (var i in options) { - if (opts[i] === undefined) opts[i] = options[i] - } - return method(opts, callback) - } - return d - } - var de = def(request) - de.get = def(request.get) - de.post = def(request.post) - de.put = def(request.put) - de.head = def(request.head) - de.del = def(request.del) - de.cookie = def(request.cookie) - de.jar = def(request.jar) - return de -} - -request.get = request -request.post = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'POST' - return request(options, callback) -} -request.put = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'PUT' - return request(options, callback) -} -request.head = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'HEAD' - if (options.body || options.requestBodyStream || options.json || options.multipart) { - throw new Error("HTTP HEAD requests MUST NOT include a request body.") - } - return request(options, callback) -} -request.del = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'DELETE' - return request(options, callback) -} -request.jar = function () { - return new CookieJar -} -request.cookie = function (str) { - if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") - return new Cookie(str) -} diff --git a/node_modules/request/mimetypes.js b/node_modules/request/mimetypes.js deleted file mode 100644 index 8691006..0000000 --- a/node_modules/request/mimetypes.js +++ /dev/null @@ -1,146 +0,0 @@ -// from http://github.com/felixge/node-paperboy -exports.types = { - "aiff":"audio/x-aiff", - "arj":"application/x-arj-compressed", - "asf":"video/x-ms-asf", - "asx":"video/x-ms-asx", - "au":"audio/ulaw", - "avi":"video/x-msvideo", - "bcpio":"application/x-bcpio", - "ccad":"application/clariscad", - "cod":"application/vnd.rim.cod", - "com":"application/x-msdos-program", - "cpio":"application/x-cpio", - "cpt":"application/mac-compactpro", - "csh":"application/x-csh", - "css":"text/css", - "deb":"application/x-debian-package", - "dl":"video/dl", - "doc":"application/msword", - "drw":"application/drafting", - "dvi":"application/x-dvi", - "dwg":"application/acad", - "dxf":"application/dxf", - "dxr":"application/x-director", - "etx":"text/x-setext", - "ez":"application/andrew-inset", - "fli":"video/x-fli", - "flv":"video/x-flv", - "gif":"image/gif", - "gl":"video/gl", - "gtar":"application/x-gtar", - "gz":"application/x-gzip", - "hdf":"application/x-hdf", - "hqx":"application/mac-binhex40", - "html":"text/html", - "ice":"x-conference/x-cooltalk", - "ico":"image/x-icon", - "ief":"image/ief", - "igs":"model/iges", - "ips":"application/x-ipscript", - "ipx":"application/x-ipix", - "jad":"text/vnd.sun.j2me.app-descriptor", - "jar":"application/java-archive", - "jpeg":"image/jpeg", - "jpg":"image/jpeg", - "js":"text/javascript", - "json":"application/json", - "latex":"application/x-latex", - "lsp":"application/x-lisp", - "lzh":"application/octet-stream", - "m":"text/plain", - "m3u":"audio/x-mpegurl", - "man":"application/x-troff-man", - "me":"application/x-troff-me", - "midi":"audio/midi", - "mif":"application/x-mif", - "mime":"www/mime", - "movie":"video/x-sgi-movie", - "mustache":"text/plain", - "mp4":"video/mp4", - "mpg":"video/mpeg", - "mpga":"audio/mpeg", - "ms":"application/x-troff-ms", - "nc":"application/x-netcdf", - "oda":"application/oda", - "ogm":"application/ogg", - "pbm":"image/x-portable-bitmap", - "pdf":"application/pdf", - "pgm":"image/x-portable-graymap", - "pgn":"application/x-chess-pgn", - "pgp":"application/pgp", - "pm":"application/x-perl", - "png":"image/png", - "pnm":"image/x-portable-anymap", - "ppm":"image/x-portable-pixmap", - "ppz":"application/vnd.ms-powerpoint", - "pre":"application/x-freelance", - "prt":"application/pro_eng", - "ps":"application/postscript", - "qt":"video/quicktime", - "ra":"audio/x-realaudio", - "rar":"application/x-rar-compressed", - "ras":"image/x-cmu-raster", - "rgb":"image/x-rgb", - "rm":"audio/x-pn-realaudio", - "rpm":"audio/x-pn-realaudio-plugin", - "rtf":"text/rtf", - "rtx":"text/richtext", - "scm":"application/x-lotusscreencam", - "set":"application/set", - "sgml":"text/sgml", - "sh":"application/x-sh", - "shar":"application/x-shar", - "silo":"model/mesh", - "sit":"application/x-stuffit", - "skt":"application/x-koan", - "smil":"application/smil", - "snd":"audio/basic", - "sol":"application/solids", - "spl":"application/x-futuresplash", - "src":"application/x-wais-source", - "stl":"application/SLA", - "stp":"application/STEP", - "sv4cpio":"application/x-sv4cpio", - "sv4crc":"application/x-sv4crc", - "svg":"image/svg+xml", - "swf":"application/x-shockwave-flash", - "tar":"application/x-tar", - "tcl":"application/x-tcl", - "tex":"application/x-tex", - "texinfo":"application/x-texinfo", - "tgz":"application/x-tar-gz", - "tiff":"image/tiff", - "tr":"application/x-troff", - "tsi":"audio/TSP-audio", - "tsp":"application/dsptype", - "tsv":"text/tab-separated-values", - "unv":"application/i-deas", - "ustar":"application/x-ustar", - "vcd":"application/x-cdlink", - "vda":"application/vda", - "vivo":"video/vnd.vivo", - "vrm":"x-world/x-vrml", - "wav":"audio/x-wav", - "wax":"audio/x-ms-wax", - "wma":"audio/x-ms-wma", - "wmv":"video/x-ms-wmv", - "wmx":"video/x-ms-wmx", - "wrl":"model/vrml", - "wvx":"video/x-ms-wvx", - "xbm":"image/x-xbitmap", - "xlw":"application/vnd.ms-excel", - "xml":"text/xml", - "xpm":"image/x-xpixmap", - "xwd":"image/x-xwindowdump", - "xyz":"chemical/x-pdb", - "zip":"application/zip", -}; - -exports.lookup = function(ext, defaultType) { - defaultType = defaultType || 'application/octet-stream'; - - return (ext in exports.types) - ? exports.types[ext] - : defaultType; -}; \ No newline at end of file diff --git a/node_modules/request/oauth.js b/node_modules/request/oauth.js deleted file mode 100644 index 25db669..0000000 --- a/node_modules/request/oauth.js +++ /dev/null @@ -1,34 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace('!','%21') - .replace('*','%2A') - .replace('(','%28') - .replace(')','%29') - .replace("'",'%27') - ; -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret, body) { - // adapted from https://dev.twitter.com/docs/auth/oauth - var base = - httpMethod + "&" + - encodeURIComponent( base_uri ) + "&" + - Object.keys(params).sort().map(function (i) { - // big WTF here with the escape + encoding but it's what twitter wants - return escape(rfc3986(i)) + "%3D" + escape(rfc3986(params[i])) - }).join("%26") - var key = consumer_secret + '&' - if (token_secret) key += token_secret - return sha1(key, base) -} - -exports.hmacsign = hmacsign -exports.rfc3986 = rfc3986 \ No newline at end of file diff --git a/node_modules/request/package.json b/node_modules/request/package.json deleted file mode 100644 index b549f06..0000000 --- a/node_modules/request/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.2.9", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "http://github.com/mikeal/request.git" - }, - "bugs": { - "url": "http://github.com/mikeal/request/issues" - }, - "engines": [ - "node >= 0.3.6" - ], - "main": "./main", - "scripts": { - "test": "bash tests/run.sh" - }, - "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
\n  npm install request\n
\n\nOr from source:\n\n
\n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It support HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\n\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `onResponse` - If true the callback will be fired on the \"response\" event instead of \"end\". If a function it will be called on \"response\" and not effect the regular semantics of the main callback on \"end\".\n* `encoding` - Encoding to be used on response.setEncoding when buffering the response data.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", - "_id": "request@2.2.9", - "_from": "request@~2.2.9" -} diff --git a/node_modules/request/tests/googledoodle.png b/node_modules/request/tests/googledoodle.png deleted file mode 100644 index f80c9c52d3c507996535a19ee0bcfe3821de322d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38510 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 diff --git a/node_modules/request/tests/run.sh b/node_modules/request/tests/run.sh deleted file mode 100755 index 57d0f64..0000000 --- a/node_modules/request/tests/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -FAILS=0 -for i in tests/test-*.js; do - echo $i - node $i || let FAILS++ -done -exit $FAILS diff --git a/node_modules/request/tests/server.js b/node_modules/request/tests/server.js deleted file mode 100644 index bad1e50..0000000 --- a/node_modules/request/tests/server.js +++ /dev/null @@ -1,57 +0,0 @@ -var http = require('http') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - ; - -exports.createServer = function (port) { - port = port || 6767 - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'http://localhost:'+port - return s; -} - -exports.createPostStream = function (text) { - var postStream = new stream.Stream(); - postStream.writeable = true; - postStream.readable = true; - setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); - return postStream; -} -exports.createPostValidator = function (text) { - var l = function (req, resp) { - var r = ''; - req.on('data', function (chunk) {r += chunk}) - req.on('end', function () { - if (r !== text) console.log(r, text); - assert.equal(r, text) - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write('OK') - resp.end() - }) - } - return l; -} -exports.createGetResponse = function (text, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - resp.write(text) - resp.end() - } - return l; -} -exports.createChunkResponse = function (chunks, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - chunks.forEach(function (chunk) { - resp.write(chunk) - }) - resp.end() - } - return l; -} diff --git a/node_modules/request/tests/test-body.js b/node_modules/request/tests/test-body.js deleted file mode 100644 index 18ad5b9..0000000 --- a/node_modules/request/tests/test-body.js +++ /dev/null @@ -1,90 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--frontier\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--frontier\r\n\r\n' + - 'Oh hi.' + - '\r\n--frontier--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) - diff --git a/node_modules/request/tests/test-cookie.js b/node_modules/request/tests/test-cookie.js deleted file mode 100644 index aeafd10..0000000 --- a/node_modules/request/tests/test-cookie.js +++ /dev/null @@ -1,29 +0,0 @@ -var Cookie = require('../vendor/cookie') - , assert = require('assert'); - -var str = 'sid=s543qactge.wKE61E01Bs%2BKhzmxrwrnug; path=/; httpOnly; expires=Sat, 04 Dec 2010 23:27:28 GMT'; -var cookie = new Cookie(str); - -// test .toString() -assert.equal(cookie.toString(), str); - -// test .path -assert.equal(cookie.path, '/'); - -// test .httpOnly -assert.equal(cookie.httpOnly, true); - -// test .name -assert.equal(cookie.name, 'sid'); - -// test .value -assert.equal(cookie.value, 's543qactge.wKE61E01Bs%2BKhzmxrwrnug'); - -// test .expires -assert.equal(cookie.expires instanceof Date, true); - -// test .path default -var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); -assert.equal(cookie.path, '/bar'); - -console.log('All tests passed'); diff --git a/node_modules/request/tests/test-cookiejar.js b/node_modules/request/tests/test-cookiejar.js deleted file mode 100644 index 76fcd71..0000000 --- a/node_modules/request/tests/test-cookiejar.js +++ /dev/null @@ -1,90 +0,0 @@ -var Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , assert = require('assert'); - -function expires(ms) { - return new Date(Date.now() + ms).toUTCString(); -} - -// test .get() expiration -(function() { - var jar = new Jar; - var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); - jar.add(cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 0); - }, 1000); - }, 5); -})(); - -// test .get() path support -(function() { - var jar = new Jar; - var a = new Cookie('sid=1234; path=/'); - var b = new Cookie('sid=1111; path=/foo/bar'); - var c = new Cookie('sid=2222; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - - // should remove the duplicates - assert.equal(jar.cookies.length, 2); - - // same name, same path, latter prevails - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], c); - - // same name, diff path, path specifity prevails, latter prevails - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], a); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=3333; path=/foo/bar'); - var c = new Cookie('pid=3333; path=/foo/bar'); - var d = new Cookie('sid=2222; path=/foo/'); - var e = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - jar.add(d); - jar.add(e); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 2); - assert.equal(cookies[0], b); - assert.equal(cookies[1], c); - - var cookies = jar.get({ url: 'http://foo.com/foo/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], d); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], e); -})(); - -setTimeout(function() { - console.log('All tests passed'); -}, 1200); diff --git a/node_modules/request/tests/test-errors.js b/node_modules/request/tests/test-errors.js deleted file mode 100644 index a7db1f7..0000000 --- a/node_modules/request/tests/test-errors.js +++ /dev/null @@ -1,30 +0,0 @@ -var server = require('./server') - , events = require('events') - , assert = require('assert') - , request = require('../main.js') - ; - -var local = 'http://localhost:8888/asdf' - -try { - request({uri:local, body:{}}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.body.') -} - -try { - request({uri:local, multipart: 'foo'}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.multipart.') -} - -try { - request({uri:local, multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -console.log("All tests passed.") diff --git a/node_modules/request/tests/test-oauth.js b/node_modules/request/tests/test-oauth.js deleted file mode 100644 index 7d969a0..0000000 --- a/node_modules/request/tests/test-oauth.js +++ /dev/null @@ -1,109 +0,0 @@ -var hmacsign = require('../oauth').hmacsign - , assert = require('assert') - , qs = require('querystring') - , request = require('../main') - ; - -function getsignature (r) { - var sign - r.headers.authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { - if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) - }) - return decodeURIComponent(sign) -} - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - - -var r = request.post( - { url: 'https://api.twitter.com/oauth/request_token' - , oauth: - { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , timestamp: '1272323042' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - } - }) - -console.log(getsignature(r)) -assert.equal(reqsign, getsignature(r)) - -var r = request.post( - { url: 'https://api.twitter.com/oauth/access_token' - , oauth: - { consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , signature_method: 'HMAC-SHA1' - , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , timestamp: '1272323047' - , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" - } - }) - -console.log(getsignature(r)) -assert.equal(accsign, getsignature(r)) - -var r = request.post( - { url: 'http://api.twitter.com/1/statuses/update.json' - , oauth: - { consumer_key: "GDdmIQH6jhtmLUypg82g" - , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , signature_method: "HMAC-SHA1" - , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , timestamp: "1272325550" - , version: "1.0" - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" - } - , form: {status: 'setting up my twitter 私のさえずりを設定する'} - }) - -console.log(getsignature(r)) -assert.equal(upsign, getsignature(r)) - diff --git a/node_modules/request/tests/test-pipes.js b/node_modules/request/tests/test-pipes.js deleted file mode 100644 index 0774647..0000000 --- a/node_modules/request/tests/test-pipes.js +++ /dev/null @@ -1,167 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var s = server.createServer(3453); - -function ValidationStream(str) { - this.str = str - this.buf = '' - this.on('data', function (data) { - this.buf += data - }) - this.on('end', function () { - assert.equal(this.str, this.buf) - }) - this.writable = true -} -util.inherits(ValidationStream, stream.Stream) -ValidationStream.prototype.write = function (chunk) { - this.emit('data', chunk) -} -ValidationStream.prototype.end = function (chunk) { - if (chunk) emit('data', chunk) - this.emit('end') -} - -s.listen(s.port, function () { - counter = 0; - - var check = function () { - counter = counter - 1 - if (counter === 0) { - console.log('All tests passed.') - setTimeout(function () { - process.exit(); - }, 500) - } - } - - // Test pipeing to a request object - s.once('/push', server.createPostValidator("mydata")); - - var mydata = new stream.Stream(); - mydata.readable = true - - counter++ - var r1 = request.put({url:'http://localhost:3453/push'}, function () { - check(); - }) - mydata.pipe(r1) - - mydata.emit('data', 'mydata'); - mydata.emit('end'); - - - // Test pipeing from a request object. - s.once('/pull', server.createGetResponse("mypulldata")); - - var mypulldata = new stream.Stream(); - mypulldata.writable = true - - counter++ - request({url:'http://localhost:3453/pull'}).pipe(mypulldata) - - var d = ''; - - mypulldata.write = function (chunk) { - d += chunk; - } - mypulldata.end = function () { - assert.equal(d, 'mypulldata'); - check(); - }; - - - s.on('/cat', function (req, resp) { - if (req.method === "GET") { - resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); - resp.end('asdf') - } else if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/plain-test'); - assert.equal(req.headers['content-length'], 4) - var validate = ''; - - req.on('data', function (chunk) {validate += chunk}) - req.on('end', function () { - resp.writeHead(201); - resp.end(); - assert.equal(validate, 'asdf'); - check(); - }) - } - }) - s.on('/pushjs', function (req, resp) { - if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/javascript'); - check(); - } - }) - s.on('/catresp', function (req, resp) { - request.get('http://localhost:3453/cat').pipe(resp) - }) - s.on('/doodle', function (req, resp) { - if (req.headers['x-oneline-proxy']) { - resp.setHeader('x-oneline-proxy', 'yup') - } - resp.writeHead('200', {'content-type':'image/png'}) - fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) - }) - s.on('/onelineproxy', function (req, resp) { - var x = request('http://localhost:3453/doodle') - req.pipe(x) - x.pipe(resp) - }) - - counter++ - fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) - - counter++ - request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) - - counter++ - request.get('http://localhost:3453/catresp', function (e, resp, body) { - assert.equal(resp.headers['content-type'], 'text/plain-test'); - assert.equal(resp.headers['content-length'], 4) - check(); - }) - - var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) - - counter++ - request.get('http://localhost:3453/doodle').pipe(doodleWrite) - - doodleWrite.on('close', function () { - assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) - check() - }) - - process.on('exit', function () { - fs.unlinkSync(path.join(__dirname, 'test.png')) - }) - - counter++ - request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { - assert.equal(resp.headers['x-oneline-proxy'], 'yup') - check() - }) - - s.on('/afterresponse', function (req, resp) { - resp.write('d') - resp.end() - }) - - counter++ - var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { - var v = new ValidationStream('d') - afterresp.pipe(v) - v.on('end', check) - }) - -}) diff --git a/node_modules/request/tests/test-proxy.js b/node_modules/request/tests/test-proxy.js deleted file mode 100644 index 647157c..0000000 --- a/node_modules/request/tests/test-proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - proxy: 'http://localhost:'+port - /* - //should behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/node_modules/request/tests/test-timeout.js b/node_modules/request/tests/test-timeout.js deleted file mode 100644 index 673f8ad..0000000 --- a/node_modules/request/tests/test-timeout.js +++ /dev/null @@ -1,87 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); -var expectedBody = "waited"; -var remainingTests = 5; - -s.listen(s.port, function () { - // Request that waits for 200ms - s.on('/timeout', function (req, resp) { - setTimeout(function(){ - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write(expectedBody) - resp.end() - }, 200); - }); - - // Scenario that should timeout - var shouldTimeout = { - url: s.url + "/timeout", - timeout:100 - } - - - request(shouldTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - - // Scenario that shouldn't timeout - var shouldntTimeout = { - url: s.url + "/timeout", - timeout:300 - } - - request(shouldntTimeout, function (err, resp, body) { - assert.equal(err, null); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with no timeout set, so shouldn't timeout - var noTimeout = { - url: s.url + "/timeout" - } - - request(noTimeout, function (err, resp, body) { - assert.equal(err); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with a negative timeout value, should be treated a zero or the minimum delay - var negativeTimeout = { - url: s.url + "/timeout", - timeout:-1000 - } - - request(negativeTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - // Scenario with a float timeout value, should be rounded by setTimeout anyway - var floatTimeout = { - url: s.url + "/timeout", - timeout: 100.76 - } - - request(floatTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - function checkDone() { - if(--remainingTests == 0) { - s.close(); - console.log("All tests passed."); - } - } -}) - diff --git a/node_modules/request/uuid.js b/node_modules/request/uuid.js deleted file mode 100644 index 1d83bd5..0000000 --- a/node_modules/request/uuid.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function () { - var s = [], itoh = '0123456789ABCDEF'; - - // Make array of random hex digits. The UUID only has 32 digits in it, but we - // allocate an extra items to make room for the '-'s we'll be inserting. - for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10); - - // Conform to RFC-4122, section 4.4 - s[14] = 4; // Set 4 high bits of time_high field to version - s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence - - // Convert to hex chars - for (var i = 0; i <36; i++) s[i] = itoh[s[i]]; - - // Insert '-'s - s[8] = s[13] = s[18] = s[23] = '-'; - - return s.join(''); -} diff --git a/node_modules/request/vendor/cookie/index.js b/node_modules/request/vendor/cookie/index.js deleted file mode 100644 index d8f29b3..0000000 --- a/node_modules/request/vendor/cookie/index.js +++ /dev/null @@ -1,55 +0,0 @@ -/*! - * Tobi - Cookie - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url'); - -/** - * Initialize a new `Cookie` with the given cookie `str` and `req`. - * - * @param {String} str - * @param {IncomingRequest} req - * @api private - */ - -var Cookie = exports = module.exports = function Cookie(str, req) { - this.str = str; - - // First key is the name - this.name = str.substr(0, str.indexOf('=')); - - // Map the key/val pairs - str.split(/ *; */).reduce(function(obj, pair){ - pair = pair.split(/ *= */); - obj[pair[0].toLowerCase()] = pair[1] || true; - return obj; - }, this); - - // Assign value - this.value = this[this.name]; - - // Expires - this.expires = this.expires - ? new Date(this.expires) - : Infinity; - - // Default or trim path - this.path = this.path || '/'; -}; - -/** - * Return the original cookie string. - * - * @return {String} - * @api public - */ - -Cookie.prototype.toString = function(){ - return this.str; -}; diff --git a/node_modules/request/vendor/cookie/jar.js b/node_modules/request/vendor/cookie/jar.js deleted file mode 100644 index 34920e0..0000000 --- a/node_modules/request/vendor/cookie/jar.js +++ /dev/null @@ -1,72 +0,0 @@ -/*! -* Tobi - CookieJar -* Copyright(c) 2010 LearnBoost -* MIT Licensed -*/ - -/** -* Module dependencies. -*/ - -var url = require('url'); - -/** -* Initialize a new `CookieJar`. -* -* @api private -*/ - -var CookieJar = exports = module.exports = function CookieJar() { - this.cookies = []; -}; - -/** -* Add the given `cookie` to the jar. -* -* @param {Cookie} cookie -* @api private -*/ - -CookieJar.prototype.add = function(cookie){ - this.cookies = this.cookies.filter(function(c){ - // Avoid duplication (same path, same name) - return !(c.name == cookie.name && c.path == cookie.path); - }); - this.cookies.push(cookie); -}; - -/** -* Get cookies for the given `req`. -* -* @param {IncomingRequest} req -* @return {Array} -* @api private -*/ - -CookieJar.prototype.get = function(req){ - var path = url.parse(req.url).pathname - , now = new Date - , specificity = {}; - return this.cookies.filter(function(cookie){ - if (0 == path.indexOf(cookie.path) && now < cookie.expires - && cookie.path.length > (specificity[cookie.name] || 0)) - return specificity[cookie.name] = cookie.path.length; - }); -}; - -/** -* Return Cookie string for the given `req`. -* -* @param {IncomingRequest} req -* @return {String} -* @api private -*/ - -CookieJar.prototype.cookieString = function(req){ - var cookies = this.get(req); - if (cookies.length) { - return cookies.map(function(cookie){ - return cookie.name + '=' + cookie.value; - }).join('; '); - } -}; diff --git a/node_modules/vows/.npmignore b/node_modules/vows/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/vows/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/vows/.travis.yml b/node_modules/vows/.travis.yml deleted file mode 100644 index aa1dc39..0000000 --- a/node_modules/vows/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js - -node_js: - - 0.4 - - 0.6 - diff --git a/node_modules/vows/LICENSE b/node_modules/vows/LICENSE deleted file mode 100644 index a1edd93..0000000 --- a/node_modules/vows/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2009 cloudhead - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vows/Makefile b/node_modules/vows/Makefile deleted file mode 100644 index 6bf8991..0000000 --- a/node_modules/vows/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# Run all tests -# -test: - @@bin/vows test/* - -.PHONY: test install diff --git a/node_modules/vows/README.md b/node_modules/vows/README.md deleted file mode 100644 index bfa410e..0000000 --- a/node_modules/vows/README.md +++ /dev/null @@ -1,65 +0,0 @@ -Vows -==== - -> Asynchronous BDD & continuous integration for node.js - -#### # - -introduction ------------- -There are two reasons why we might want asynchronous testing. The first, and obvious reason is that node.js is asynchronous, and therefore our tests need to be. The second reason is to make test suites which target I/O libraries run much faster. - -_Vows_ is an experiment in making this possible, while adding a minimum of overhead. - -synopsis --------- - - var vows = require('vows'), - assert = require('assert'); - - vows.describe('Deep Thought').addBatch({ - 'An instance of DeepThought': { - topic: new DeepThought, - - 'should know the answer to the ultimate question of life': function (deepThought) { - assert.equal (deepThought.question('what is the answer to the universe?'), 42); - } - } - }); - -coverage reporting ------------------- -Code coverage reporting is available if _instrumented_ code is detected. Currently only _instrumentation_ via [node-jscoverage](https://github.com/visionmedia/node-jscoverage) is supported. When _instrumented_ code is detected and coverage reporting is enabled using any of the `--cover-plain`, `--cover-html`, or `--cover-json` options a code coverage map is generated. - -### downloading and installing [node-jscoverage](https://github.com/visionmedia/node-jscoverage) -[node-jscoverage](https://github.com/visionmedia/node-jscoverage) is a binary package that needs to be compiled from source: - - $ git clone https://github.com/visionmedia/node-jscoverage.git - $ cd node-jscoverage/ - $ ./configure - checking for a BSD-compatible install... /usr/bin/install -c - checking whether build environment is sane... yes - [...] - $ make && sudo make install - -### instrumenting with jscoverage - - $ jscoverage myfile.js myfile-instrumented.js - -installation ------------- - - $ npm install vows - -documentation -------------- - -Head over to - -authors -------- - -Alexis Sellier <>, Charlie Robbins, - -*...and many others* - diff --git a/node_modules/vows/bin/vows b/node_modules/vows/bin/vows deleted file mode 100755 index 2694549..0000000 --- a/node_modules/vows/bin/vows +++ /dev/null @@ -1,579 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'), - fs = require('fs'), - util = require('util'), - events = require('events'); - -// -// Attempt to load Coffee-Script. If it's not available, continue on our -// merry way, if it is available, start searching for `*.coffee` scripts too. -// -var fileExt, specFileExt; - -try { - var coffee = require('coffee-script'); - fileExt = /\.(js|coffee)$/; - specFileExt = /[.(-|_)]((t|T)est|(s|S)pec)\.(js|coffee)$/; -} catch (_) { - fileExt = /\.js$/; - specFileExt = /[.(-|_)]((t|T)est|(s|S)pec)\.js$/; -} - -var inspect = require('eyes').inspector({ - stream: null, - styles: { string: 'grey', regexp: 'grey' } -}); - -var vows = require('../lib/vows'); -var cutils = require('../lib/vows/console'); -var stylize = require('../lib/vows/console').stylize; -var _reporter = require('../lib/vows/reporters/dot-matrix'), reporter = { - name: _reporter.name -}; -var _coverage; - -var nodeMinorVersion = parseInt(process.version.split('.')[1], 10); - -var help = [ - "usage: vows [FILE, ...] [options]", - "", - "options:", - " -v, --verbose Enable verbose output", - " -w, --watch Watch mode", - " -s, --silent Don't report", - " -i, --isolate Run each test in it's own vows process", - " -m PATTERN Only run tests matching the PATTERN string", - " -r PATTERN Only run tests matching the PATTERN regexp", - " --json Use JSON reporter", - " --spec Use Spec reporter", - " --tap Use TAP reporter", - " --dot-matrix Use Dot-Matrix reporter", - " --xunit Use xUnit reporter", - " --cover-plain Print plain coverage map if detected", - " --cover-html Write coverage map to \"coverage.html\"", - " --cover-json Write unified coverage map to \"coverage.json\"", - " --cover-xml Write coverage map to \"coverage.xml\" in Emma xml", - " --no-color Don't use terminal colors", - " --version Show version", - " -h, --help You're staring at it" -].join('\n'); - -var options = { - reporter: reporter, - matcher: /.*/, - watch: false, - coverage: false, - isolate: false, - shuffle: false, - nocolor: !process.stdout.isTTY -}; - -var files = []; - -// Get rid of process runner -// ('node' in most cases) -var arg, args = [], argv = process.argv.slice(2); - -// Current directory index, -// and path of test folder. -var root, testFolder; - -// -// Parse command-line parameters -// -while (arg = argv.shift()) { - if (arg === __filename) { continue } - - if (arg[0] !== '-') { - args.push(arg); - } else { - arg = arg.match(/^--?(.+)/)[1]; - - if (arg[0] === 'r') { - options.matcher = new(RegExp)(argv.shift()); - } else if (arg[0] === 'm') { - options.matcher = (function (str) { // Create an escaped RegExp - var specials = '. * + ? | ( ) [ ] { } \\ ^ ? ! = : $'.split(' ').join('|\\'), - regex = new(RegExp)('(\\' + specials + ')', 'g'); - return new(RegExp)(str.replace(regex, '\\$1')); - })(argv.shift()); - } else if (arg in options) { - options[arg] = true; - } else { - switch (arg) { - case 'json': - _reporter = require('../lib/vows/reporters/json'); - break; - case 'spec': - _reporter = require('../lib/vows/reporters/spec'); - break; - case 'tap': - _reporter = require('../lib/vows/reporters/tap'); - break; - case 'dot-matrix': - _reporter = require('../lib/vows/reporters/dot-matrix'); - break; - case 'silent': - case 's': - _reporter = require('../lib/vows/reporters/silent'); - break; - case 'xunit': - _reporter = require('../lib/vows/reporters/xunit'); - break; - case 'cover-plain': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-plain'); - break; - case 'cover-html': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-html'); - break; - case 'cover-json': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-json'); - break; - case 'cover-xml': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-xml'); - break; - case 'verbose': - case 'v': - options.verbose = true; - break; - case 'watch': - case 'w': - options.watch = true; - break; - case 'supress-stdout': - options.supressStdout = true; - break; - case 'shuffle': - options.shuffle = true; - break; - case 'isolate': - case 'i': - options.isolate = true; - break; - case 'no-color': - options.nocolor = true; - break; - case 'color': - options.nocolor = false; - break; - case 'no-error': - options.error = false; - break; - case 'version': - console.log('vows ' + vows.version); - process.exit(0); - case 'help': - case 'h': - console.log(help); - process.exit(0); - break; - } - } - } -} - -if (options.nocolor) { - cutils.nocolor = true; - inspect = require('eyes').inspector({ stream: null, styles: false }); -} - -if (options.supressStdout) { - _reporter.setStream && _reporter.setStream(process.stdout); - var devNullStream = fs.createWriteStream('/dev/null'); - process.__defineGetter__('stdout', function () { - return devNullStream; - }); -} - -if (options.watch) { - options.reporter = reporter = require('../lib/vows/reporters/watch'); -} - -msg('bin', 'argv', args); -msg('bin', 'options', { reporter: options.reporter.name, matcher: options.matcher }); - -if (args.length === 0 || options.watch) { - msg('bin', 'discovering', 'folder structure'); - root = fs.readdirSync('.'); - - if (root.indexOf('test') !== -1) { - testFolder = 'test'; - } else if (root.indexOf('spec') !== -1) { - testFolder = 'spec'; - } else { - abort("runner", "couldn't find test folder"); - } - msg('bin', 'discovered', "./" + testFolder); - if (args.length === 0) { - args = paths(testFolder).filter(function (f) { - return specFileExt.test(f); - }); - - if (options.watch) { - args = args.concat(paths('lib'), paths('src')); - } - } -} - -if (! options.watch) { - reporter.report = function (data, filename) { - switch (data[0]) { - case 'subject': - case 'vow': - case 'context': - case 'error': - _reporter.report(data, filename); - break; - case 'end': - (options.verbose || _reporter.name === 'json') && - _reporter.report(data); - break; - case 'finish': - options.verbose ? - _reporter.print('\n') - : - _reporter.print(' '); - break; - } - }; - reporter.reset = function () { _reporter.reset && _reporter.reset() }; - reporter.print = _reporter.print; - - files = args.map(function (a) { - return (!a.match(/^\//)) - ? path.join(process.cwd(), a.replace(fileExt, '')) - : a.replace(fileExt, ''); - }); - - if (options.shuffle) { - var source = files.slice(0); - files.length = 0; - while (source.length) { - files.push(source.splice(Math.floor(Math.random() * source.length), 1)[0]); - } - } - - runSuites(importSuites(files), function (results) { - var status = results.errored ? 2 : (results.broken ? 1 : 0); - - !options.verbose && _reporter.print('\n'); - msg('runner', 'finish'); - _reporter.report(['finish', results], { - write: function (str) { - util.print(str.replace(/^\n\n/, '\n')); - } - }); - try { - if (options.coverage === true && _$jscoverage !== undefined) { - _coverage.report(_$jscoverage); - } - } catch (err) { - // ignore the undefined jscoverage - } - if (process.stdout.write('')) { // Check if stdout is drained - process.exit(status); - } else { - process.stdout.on('drain', function () { - process.exit(status); - }); - } - }); -} else { - // - // Watch mode - // - (function () { - var pendulum = [ - '. ', '.. ', '... ', ' ...', - ' ..', ' .', ' .', ' ..', - '... ', '.. ', '. ' - ]; - var strobe = ['.', ' ']; - var status, - cue, - current = 0, - running = 0, - lastRun, - colors = ['32m', '33m', '31m'], - timer = setInterval(tick, 100); - process.on('uncaughtException', exception); - process.on('exit', cleanup); - process.on('SIGINT', function () { - process.exit(0); - }); - process.on('SIGQUIT', function () { - changed(); - }); - - cursorHide(); - - // Run every 100ms - function tick() { - if (running && (cue !== strobe)) { - cue = strobe, current = 0; - } else if (!running && (cue !== pendulum)) { - cue = pendulum, current = 0; - } - - eraseLine(); - lastRun && !running && esc(colors[status.errored ? 2 : (status.broken ? 1 : 0)]); - print(cue[current]); - - if (current == cue.length - 1) { current = -1 } - - current ++; - esc('39m'); - cursorRestore(); - } - - // - // Utility functions - // - function print(str) { util.print(str) } - function esc(str) { print("\x1b[" + str) } - function eraseLine() { esc("0K") } - function cursorRestore() { esc("0G") } - function cursorHide() { esc("?25l") } - function cursorShow() { esc("?25h") } - function cleanup() { eraseLine(), cursorShow(), clearInterval(timer), print('\n') } - function exception(err) { print(err.stack || err.message || JSON.stringify(err)), running = 0} - - // - // Get a matching test for a given file - // - function getMatchingTest(file, join) { - join || (join = '-'); - var testFile; - if (specFileExt.test(file)) { - testFile = path.join(testFolder, file); - } - else { - var root, extension; - _s = file.split('.'), root = _s[0], extension = _s[1]; - testFile = path.join(testFolder, root + join + testFolder + "." + extension); - } - - try { - fs.statSync(testFile); - } catch (e) { - if (join == '-') { - return getMatchingTest(file, '_'); - } - else { - msg('watcher', 'no equivalence found, running all tests.'); - testFile = null; - } - } - return testFile; - } - - // - // Called when a file has been modified. - // Run the matching tests and change the status. - // - function changed(file) { - status = { honored: 0, broken: 0, errored: 0, pending: 0 }; - - msg('watcher', 'detected change in', file); - - file = getMatchingTest(file); - - var files = (specFileExt.test(file) ? [file] : paths(testFolder)).map(function (p) { - return path.join(process.cwd(), p); - }).filter(function (p) { - return specFileExt.test(p); - }).map(function (p) { - var cache = require.main.moduleCache || require.cache; - if (cache[p]) { delete(cache[p]) } - return p; - }).map(function (p) { - return p.replace(fileExt, ''); - }); - - running ++; - - runSuites(importSuites(files), function (results) { - delete(results.time); - print(cutils.result(results).join('') + '\n\n'); - lastRun = new(Date); - status = results; - running --; - }); - } - - msg('watcher', 'watching', args); - - // - // Watch all relevant files, - // and call `changed()` on change. - // - args.forEach(function (p) { - fs.watchFile(p, function (current, previous) { - if (new(Date)(current.mtime).valueOf() === - new(Date)(previous.mtime).valueOf()) { return } - else { - changed(p); - } - }); - }); - })(); -} - -function runSuites(suites, callback) { - var results = { - honored: 0, - broken: 0, - errored: 0, - pending: 0, - total: 0, - time: 0 - }; - reporter.reset(); - - (function run(suites, callback) { - var suite = suites.shift(); - if (suite) { - msg('runner', "running", suite.subject + ' ', options.watch ? false : true); - suite.run(options, function (result) { - Object.keys(result).forEach(function (k) { - results[k] += result[k]; - }); - run(suites, callback); - }); - } else { - callback(results); - } - })(suites, callback); -} - -function importSuites(files) { - msg(options.watcher ? 'watcher' : 'runner', 'loading', files); - - var spawn = require('child_process').spawn; - - function cwdname(f) { - return f.replace(process.cwd() + '/', '') + '.js'; - } - - function wrapSpawn(f) { - f = cwdname(f); - return function (options, callback) { - var args = [process.argv[1], '--json', '--supress-stdout', f], - p = spawn(process.execPath, args), - result; - - // - // AvianFlu, you broke the API! OH NOEZ. - // Anyway. - // Since node 0.7.something, semantics of child process events - // changed - `exit` event is emitted when child process exits - // and `close` event is emitted when child's streams stdio streams - // are closed. `exit` event is emitted before `close` event, and - // since we use child's stdio streams, we shouldn't rely on `exit` - // event. - // - p.on(nodeMinorVersion >= 7 ? 'close' : 'exit', function (code) { - callback( - !result ? - {errored: 1, total: 1} - : - result - ); - }); - - var buffer = []; - p.stdout.on('data', function (data) { - data = data.toString().split(/\n/g); - if (data.length == 1) { - buffer.push(data[0]); - } else { - data[0] = buffer.concat(data[0]).join(''); - buffer = [data.pop()]; - - data.forEach(function (data) { - if (data) { - data = JSON.parse(data); - if (data && data[0] === 'finish') { - result = data[1]; - } else { - reporter.report(data); - } - } - }); - } - }); - - p.stderr.pipe(process.stderr); - } - } - - return files.reduce(options.isolate ? function (suites, f) { - return suites.concat({ - run: wrapSpawn(f) - }); - } : function (suites, f) { - var obj = require(f); - return suites.concat(Object.keys(obj).map(function (s) { - obj[s]._filename = cwdname(f); - return obj[s]; - })); - }, []) -} - -// -// Recursively traverse a hierarchy, returning -// a list of all relevant .js files. -// -function paths(dir) { - var paths = []; - - try { fs.statSync(dir) } - catch (e) { return [] } - - (function traverse(dir, stack) { - stack.push(dir); - fs.readdirSync(stack.join('/')).forEach(function (file) { - // - // Skip dotfiles and `vendor` directory before `fs.stat()`ing them. - // Not doing so causes race conditions with Emacs buffer files - // (`.#filename.js`). - // - if (file[0] == '.' || file === 'vendor') { - return; - } - - var path = stack.concat([file]).join('/'), - stat = fs.statSync(path); - - if (stat.isFile() && fileExt.test(file)) { - paths.push(path); - } else if (stat.isDirectory()) { - traverse(file, stack); - } - }); - stack.pop(); - })(dir || '.', []); - - return paths; -} - -function msg(cmd, subject, str, p) { - if (options.verbose) { - util[p ? 'print' : 'puts']( stylize('vows ', 'green') - + stylize(cmd, 'bold') - + ' ' + subject + ' ' - + (str ? (typeof(str) === 'string' ? str : inspect(str)) : '') - ); - } -} - -function abort(cmd, str) { - console.log(stylize('vows ', 'red') + stylize(cmd, 'bold') + ' ' + str); - console.log(stylize('vows ', 'red') + stylize(cmd, 'bold') + ' exiting'); - process.exit(-1); -} diff --git a/node_modules/vows/lib/assert/error.js b/node_modules/vows/lib/assert/error.js deleted file mode 100644 index b8fcf57..0000000 --- a/node_modules/vows/lib/assert/error.js +++ /dev/null @@ -1,152 +0,0 @@ -/** -This software contains code adapted from Mocha -(https://github.com/visionmedia/mocha) by TJ Holowaychuk -and is used herein under the following MIT license: - -Copyright (c) 2011-2012 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -var stylize = require('../vows/console').stylize; -var inspect = require('../vows/console').inspect; -var diff = require('diff'); - -/** - * Pad the given `str` to `len`. - * - * @param {String} str - * @param {String} len - * @return {String} - * @api private - */ - -function pad(str, len) { - str = String(str); - return Array(len - str.length + 1).join(' ') + str; -} - -/** - * Color lines for `str`, using the color `name`. - * - * @param {String} name - * @param {String} str - * @return {String} - * @api private - */ - -function styleLines(str, name) { - return str.split('\n').map(function(str){ - return stylize(str, name); - }).join('\n'); -} - -/** - * Return a character diff for `err`. - * - * @param {Error} err - * @return {String} - * @api private - */ - -function errorDiff(err, type) { - return diff['diff' + type](err.actual, err.expected).map(function(str){ - if (/^(\n+)$/.test(str.value)) str.value = Array(++RegExp.$1.length).join(''); - if (str.added) return styleLines(str.value, 'green'); - if (str.removed) return styleLines(str.value, 'red'); - return str.value; - }).join(''); -} - -require('assert').AssertionError.prototype.toString = function () { - var that = this, - source; - - if (this.stack) { - source = this.stack.match(/([a-zA-Z0-9._-]+\.(?:js|coffee))(:\d+):\d+/); - } - - function parse(str) { - var actual = that.actual, - expected = that.expected, - msg, len; - - if ( - 'string' === typeof actual && - 'string' === typeof expected - ) { - len = Math.max(actual.length, expected.length); - - if (len < 20) msg = errorDiff(that, 'Chars'); - else msg = errorDiff(that, 'Words'); - - // linenos - var lines = msg.split('\n'); - if (lines.length > 4) { - var width = String(lines.length).length; - msg = lines.map(function(str, i){ - return pad(++i, width) + ' |' + ' ' + str; - }).join('\n'); - } - - // legend - msg = '\n' - + stylize('actual', 'green') - + ' ' - + stylize('expected', 'red') - + '\n\n' - + msg - + '\n'; - - // indent - msg = msg.replace(/^/gm, ' '); - - return msg; - } - - actual = inspect(actual, {showHidden: actual instanceof Error}); - - if (expected instanceof Function) { - expected = expected.name; - } - else { - expected = inspect(expected, {showHidden: actual instanceof Error}); - } - - return str.replace(/{actual}/g, actual). - replace(/{operator}/g, stylize(that.operator, 'bold')). - replace(/{expected}/g, expected); - } - - if (this.message) { - var msg = stylize(parse(this.message), 'yellow'); - if (source) { - msg += stylize(' // ' + source[1] + source[2], 'grey'); - } - return msg; - } else { - return stylize([ - this.expected, - this.operator, - this.actual - ].join(' '), 'yellow'); - } -}; - diff --git a/node_modules/vows/lib/assert/macros.js b/node_modules/vows/lib/assert/macros.js deleted file mode 100644 index 1e04e9e..0000000 --- a/node_modules/vows/lib/assert/macros.js +++ /dev/null @@ -1,222 +0,0 @@ -var assert = require('assert'), - utils = require('./utils'); - -var messages = { - 'equal' : "expected {expected},\n\tgot\t {actual} ({operator})", - 'notEqual' : "didn't expect {actual} ({operator})" -}; -messages['strictEqual'] = messages['deepEqual'] = messages['equal']; -messages['notStrictEqual'] = messages['notDeepEqual'] = messages['notEqual']; - -for (var key in messages) { - assert[key] = (function (key, callback) { - return function (actual, expected, message) { - callback(actual, expected, message || messages[key]); - }; - })(key, assert[key]); -} - -assert.epsilon = function (eps, actual, expected, message) { - if (Math.abs(actual - expected) > eps) { - assert.fail(actual, expected, message || "expected {expected} \u00B1"+ eps +", but was {actual}"); - } -}; - -assert.ok = (function (callback) { - return function (actual, message) { - callback(actual, message || "expected expression to evaluate to {expected}, but was {actual}"); - }; -})(assert.ok); - -assert.match = function (actual, expected, message) { - if (! expected.test(actual)) { - assert.fail(actual, expected, message || "expected {actual} to match {expected}", "match", assert.match); - } -}; -assert.matches = assert.match; - -assert.isTrue = function (actual, message) { - if (actual !== true) { - assert.fail(actual, true, message || "expected {expected}, got {actual}", "===", assert.isTrue); - } -}; -assert.isFalse = function (actual, message) { - if (actual !== false) { - assert.fail(actual, false, message || "expected {expected}, got {actual}", "===", assert.isFalse); - } -}; -assert.isZero = function (actual, message) { - if (actual !== 0) { - assert.fail(actual, 0, message || "expected {expected}, got {actual}", "===", assert.isZero); - } -}; -assert.isNotZero = function (actual, message) { - if (actual === 0) { - assert.fail(actual, 0, message || "expected non-zero value, got {actual}", "===", assert.isNotZero); - } -}; - -assert.greater = function (actual, expected, message) { - if (actual <= expected) { - assert.fail(actual, expected, message || "expected {actual} to be greater than {expected}", ">", assert.greater); - } -}; -assert.lesser = function (actual, expected, message) { - if (actual >= expected) { - assert.fail(actual, expected, message || "expected {actual} to be lesser than {expected}", "<", assert.lesser); - } -}; - -assert.inDelta = function (actual, expected, delta, message) { - var lower = expected - delta; - var upper = expected + delta; - if (actual < lower || actual > upper) { - assert.fail(actual, expected, message || "expected {actual} to be in within *" + delta.toString() + "* of {expected}", null, assert.inDelta); - } -}; - -// -// Inclusion -// -assert.include = function (actual, expected, message) { - if ((function (obj) { - if (isArray(obj) || isString(obj)) { - return obj.indexOf(expected) === -1; - } else if (isObject(actual)) { - return ! obj.hasOwnProperty(expected); - } - return true; - })(actual)) { - assert.fail(actual, expected, message || "expected {actual} to include {expected}", "include", assert.include); - } -}; -assert.includes = assert.include; - -assert.deepInclude = function (actual, expected, message) { - if (!isArray(actual)) { - return assert.include(actual, expected, message); - } - if (!actual.some(function (item) { return utils.deepEqual(item, expected) })) { - assert.fail(actual, expected, message || "expected {actual} to include {expected}", "include", assert.deepInclude); - } -}; -assert.deepIncludes = assert.deepInclude; - -// -// Length -// -assert.isEmpty = function (actual, message) { - if ((isObject(actual) && Object.keys(actual).length > 0) || actual.length > 0) { - assert.fail(actual, 0, message || "expected {actual} to be empty", "length", assert.isEmpty); - } -}; -assert.isNotEmpty = function (actual, message) { - if ((isObject(actual) && Object.keys(actual).length === 0) || actual.length === 0) { - assert.fail(actual, 0, message || "expected {actual} to be not empty", "length", assert.isNotEmpty); - } -}; - -assert.lengthOf = function (actual, expected, message) { - var len = isObject(actual) ? Object.keys(actual).length : actual.length; - if (len !== expected) { - assert.fail(actual, expected, message || "expected {actual} to have {expected} element(s)", "length", assert.length); - } -}; - -// -// Type -// -assert.isArray = function (actual, message) { - assertTypeOf(actual, 'array', message || "expected {actual} to be an Array", assert.isArray); -}; -assert.isObject = function (actual, message) { - assertTypeOf(actual, 'object', message || "expected {actual} to be an Object", assert.isObject); -}; -assert.isNumber = function (actual, message) { - if (isNaN(actual)) { - assert.fail(actual, 'number', message || "expected {actual} to be of type {expected}", "isNaN", assert.isNumber); - } else { - assertTypeOf(actual, 'number', message || "expected {actual} to be a Number", assert.isNumber); - } -}; -assert.isBoolean = function (actual, message) { - if (actual !== true && actual !== false) { - assert.fail(actual, 'boolean', message || "expected {actual} to be a Boolean", "===", assert.isBoolean); - } -}; -assert.isNaN = function (actual, message) { - if (actual === actual) { - assert.fail(actual, 'NaN', message || "expected {actual} to be NaN", "===", assert.isNaN); - } -}; -assert.isNull = function (actual, message) { - if (actual !== null) { - assert.fail(actual, null, message || "expected {expected}, got {actual}", "===", assert.isNull); - } -}; -assert.isNotNull = function (actual, message) { - if (actual === null) { - assert.fail(actual, null, message || "expected non-null value, got {actual}", "===", assert.isNotNull); - } -}; -assert.isUndefined = function (actual, message) { - if (actual !== undefined) { - assert.fail(actual, undefined, message || "expected {actual} to be {expected}", "===", assert.isUndefined); - } -}; -assert.isDefined = function (actual, message) { - if(actual === undefined) { - assert.fail(actual, 0, message || "expected {actual} to be defined", "===", assert.isDefined); - } -}; -assert.isString = function (actual, message) { - assertTypeOf(actual, 'string', message || "expected {actual} to be a String", assert.isString); -}; -assert.isFunction = function (actual, message) { - assertTypeOf(actual, 'function', message || "expected {actual} to be a Function", assert.isFunction); -}; -assert.typeOf = function (actual, expected, message) { - assertTypeOf(actual, expected, message, assert.typeOf); -}; -assert.instanceOf = function (actual, expected, message) { - if (! (actual instanceof expected)) { - assert.fail(actual, expected, message || "expected {actual} to be an instance of {expected}", "instanceof", assert.instanceOf); - } -}; - -// -// Utility functions -// - -function assertTypeOf(actual, expected, message, caller) { - if (typeOf(actual) !== expected) { - assert.fail(actual, expected, message || "expected {actual} to be of type {expected}", "typeOf", caller); - } -}; - -function isArray (obj) { - return Array.isArray(obj); -} - -function isString (obj) { - return typeof(obj) === 'string' || obj instanceof String; -} - -function isObject (obj) { - return typeof(obj) === 'object' && obj && !isArray(obj); -} - -// A better `typeof` -function typeOf(value) { - var s = typeof(value), - types = [Object, Array, String, RegExp, Number, Function, Boolean, Date]; - - if (s === 'object' || s === 'function') { - if (value) { - types.forEach(function (t) { - if (value instanceof t) { s = t.name.toLowerCase() } - }); - } else { s = 'null' } - } - return s; -} diff --git a/node_modules/vows/lib/assert/utils.js b/node_modules/vows/lib/assert/utils.js deleted file mode 100644 index dccd0f6..0000000 --- a/node_modules/vows/lib/assert/utils.js +++ /dev/null @@ -1,77 +0,0 @@ - -// Taken from node/lib/assert.js -exports.deepEqual = function (actual, expected) { - if (actual === expected) { - return true; - - } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { - if (actual.length != expected.length) return false; - - for (var i = 0; i < actual.length; i++) { - if (actual[i] !== expected[i]) return false; - } - return true; - - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - } else { - return objEquiv(actual, expected); - } -} - -// Taken from node/lib/assert.js -exports.notDeepEqual = function (actual, expected, message) { - if (exports.deepEqual(actual, expected)) { - fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); - } -} - -// Taken from node/lib/assert.js -function isUndefinedOrNull(value) { - return value === null || value === undefined; -} - -// Taken from node/lib/assert.js -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -// Taken from node/lib/assert.js -function objEquiv(a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - if (a.prototype !== b.prototype) return false; - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return exports.deepEqual(a, b); - } - try { - var ka = Object.keys(a), - kb = Object.keys(b), - key, i; - } catch (e) { - return false; - } - if (ka.length != kb.length) - return false; - ka.sort(); - kb.sort(); - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!exports.deepEqual(a[key], b[key])) return false; - } - return true; -} - diff --git a/node_modules/vows/lib/vows.js b/node_modules/vows/lib/vows.js deleted file mode 100644 index 82324ef..0000000 --- a/node_modules/vows/lib/vows.js +++ /dev/null @@ -1,256 +0,0 @@ -// -// Vows.js - asynchronous event-based BDD for node.js -// -// usage: -// -// var vows = require('vows'); -// -// vows.describe('Deep Thought').addBatch({ -// "An instance of DeepThought": { -// topic: new DeepThought, -// -// "should know the answer to the ultimate question of life": function (deepThought) { -// assert.equal (deepThought.question('what is the answer to the universe?'), 42); -// } -// } -// }).run(); -// -var util = require('util'), - path = require('path'), - events = require('events'), - vows = exports; - -// Options -vows.options = { - Emitter: events.EventEmitter, - reporter: require('./vows/reporters/dot-matrix'), - matcher: /.*/, - error: true // Handle "error" event -}; - -vows.__defineGetter__('reporter', function () { - return vows.options.reporter; -}); - -var stylize = require('./vows/console').stylize; -var console = vows.console = require('./vows/console'); - -vows.inspect = require('./vows/console').inspect; -vows.prepare = require('./vows/extras').prepare; -vows.tryEnd = require('./vows/suite').tryEnd; - -// -// Assertion Macros & Extensions -// -require('./assert/error'); -require('./assert/macros'); - -// -// Suite constructor -// -var Suite = require('./vows/suite').Suite; - -// -// This function gets added to events.EventEmitter.prototype, by default. -// It's essentially a wrapper around `on`, which adds all the specification -// goodness. -// -function addVow(vow) { - var batch = vow.batch, - event = vow.binding.context.event || 'success', - self = this; - - batch.total ++; - batch.vows.push(vow); - - // always set a listener on the event - this.on(event, function () { - var args = Array.prototype.slice.call(arguments); - // If the vow is a sub-event then we know it is an - // emitted event. So I don't muck with the arguments - // However the legacy behavior: - // If the callback is expecting two or more arguments, - // pass the error as the first (null) and the result after. - if (!(this.ctx && this.ctx.isEvent) && - vow.callback.length >= 2 && batch.suite.options.error) { - args.unshift(null); - } - runTest(args, this.ctx); - vows.tryEnd(batch); - }); - - if (event !== 'error') { - this.on("error", function (err) { - if (vow.callback.length >= 2 || !batch.suite.options.error) { - runTest(arguments, this.ctx); - } else { - output('errored', { type: 'promise', error: err.stack || - err.message || JSON.stringify(err) }); - } - vows.tryEnd(batch); - }); - } - - // in case an event fired before we could listen - if (this._vowsEmitedEvents && - this._vowsEmitedEvents.hasOwnProperty(event)) { - // make sure no one is messing with me - if (Array.isArray(this._vowsEmitedEvents[event])) { - // I don't think I need to optimize for one event, - // I think it is more important to make sure I check the vow n times - self._vowsEmitedEvents[event].forEach(function(args) { - runTest(args, self.ctx); - }); - } else { - // initial conditions problem - throw new Error('_vowsEmitedEvents[' + event + '] is not an Array') - } - vows.tryEnd(batch); - } - - return this; - - function runTest(args, ctx) { - if (vow.callback instanceof String) { - return output('pending'); - } - - if (vow.binding.context.isEvent && vow.binding.context.after) { - var after = vow.binding.context.after; - // only need to check order. I won't get here if the after event - // has never been emitted - if (self._vowsEmitedEventsOrder.indexOf(after) > - self._vowsEmitedEventsOrder.indexOf(event)) { - output('broken', event + ' emitted before ' + after); - return; - } - } - - // Run the test, and try to catch `AssertionError`s and other exceptions; - // increment counters accordingly. - try { - vow.callback.apply(ctx === global || !ctx ? vow.binding : ctx, args); - output('honored'); - } catch (e) { - if (e.name && e.name.match(/AssertionError/)) { - output('broken', e.toString().replace(/\`/g, '`')); - } else { - output('errored', e.stack || e.message || e); - } - } - } - - function output(status, exception) { - batch[status] ++; - vow.status = status; - - if (vow.context && batch.lastContext !== vow.context) { - batch.lastContext = vow.context; - batch.suite.report(['context', vow.context]); - } - batch.suite.report(['vow', { - title: vow.description, - context: vow.context, - status: status, - exception: exception || null - }]); - } -}; - -// -// On exit, check that all promises have been fired. -// If not, report an error message. -// -process.on('exit', function () { - var results = { honored: 0, broken: 0, errored: 0, pending: 0, total: 0 }, - failure; - - vows.suites.forEach(function (s) { - if ((s.results.total > 0) && (s.results.time === null)) { - s.reporter.print('\n\n'); - s.reporter.report(['error', { error: "Asynchronous Error", suite: s }]); - } - s.batches.forEach(function (b) { - var unFired = []; - - b.vows.forEach(function (vow) { - if (! vow.status) { - if (unFired.indexOf(vow.context) === -1) { - unFired.push(vow.context); - } - } - }); - - if (unFired.length > 0) { util.print('\n') } - - unFired.forEach(function (title) { - s.reporter.report(['error', { - error: "callback not fired", - context: title, - batch: b, - suite: s - }]); - }); - - if (b.status === 'begin') { - failure = true; - results.errored ++; - results.total ++; - } - Object.keys(results).forEach(function (k) { results[k] += b[k] }); - }); - }); - if (failure) { - util.puts(console.result(results)); - process.exit(1); - } -}); - -vows.suites = []; - -// We need the old emit function so we can hook it -// and do magic to deal with events that have fired -var oldEmit = vows.options.Emitter.prototype.emit; - -// -// Create a new test suite -// -vows.describe = function (subject) { - var suite = new(Suite)(subject); - - this.options.Emitter.prototype.addVow = addVow; - // just in case someone emit's before I get to it - this.options.Emitter.prototype.emit = function (event) { - this._vowsEmitedEvents = this._vowsEmitedEvents || {}; - this._vowsEmitedEventsOrder = this._vowsEmitedEventsOrder || []; - // slice off the event - var args = Array.prototype.slice.call(arguments, 1); - // if multiple events are fired, add or push - if (this._vowsEmitedEvents.hasOwnProperty(event)) { - this._vowsEmitedEvents[event].push(args); - } else { - this._vowsEmitedEvents[event] = [args]; - } - - // push the event onto a stack so I have an order - this._vowsEmitedEventsOrder.push(event); - return oldEmit.apply(this, arguments); - } - this.suites.push(suite); - - // - // Add any additional arguments as batches if they're present - // - if (arguments.length > 1) { - for (var i = 1, l = arguments.length; i < l; ++i) { - suite.addBatch(arguments[i]); - } - } - - return suite; -}; - - -vows.version = JSON.parse(require('fs') - .readFileSync(path.join(__dirname, '..', 'package.json'))) - .version diff --git a/node_modules/vows/lib/vows/console.js b/node_modules/vows/lib/vows/console.js deleted file mode 100644 index 900cef9..0000000 --- a/node_modules/vows/lib/vows/console.js +++ /dev/null @@ -1,140 +0,0 @@ -var eyes = require('eyes').inspector({ stream: null, styles: false }); - -// Stylize a string -this.stylize = function stylize(str, style) { - if (module.exports.nocolor) { - return str; - } - - var styles = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'cyan' : [96, 39], - 'yellow' : [33, 39], - 'green' : [32, 39], - 'red' : [31, 39], - 'grey' : [90, 39], - 'green-hi' : [92, 32], - }; - return '\033[' + styles[style][0] + 'm' + str + - '\033[' + styles[style][1] + 'm'; -}; - -var $ = this.$ = function (str) { - str = new(String)(str); - - ['bold', 'grey', 'yellow', 'red', 'green', 'white', 'cyan', 'italic'].forEach(function (style) { - Object.defineProperty(str, style, { - get: function () { - return exports.$(exports.stylize(this, style)); - } - }); - }); - return str; -}; - -this.puts = function (options) { - var stylize = exports.stylize; - options.stream || (options.stream = process.stdout); - options.tail = options.tail || ''; - - return function (args) { - args = Array.prototype.slice.call(arguments); - if (!options.raw) { - args = args.map(function (a) { - return a.replace(/`([^`]+)`/g, function (_, capture) { return stylize(capture, 'italic') }) - .replace(/\*([^*]+)\*/g, function (_, capture) { return stylize(capture, 'bold') }) - .replace(/\n/g, function (_, capture) { return ' \n ' } ); - }); - } - return options.stream.write(args.join('\n') + options.tail); - }; -}; - -this.result = function (event) { - var result = [], buffer = [], time = '', header; - var complete = event.honored + event.pending + event.errored + event.broken; - var status = (event.errored && 'errored') || (event.broken && 'broken') || - (event.honored && 'honored') || (event.pending && 'pending'); - - if (event.total === 0) { - return [$("Could not find any tests to run.").bold.red]; - } - - event.honored && result.push($(event.honored).bold + " honored"); - event.broken && result.push($(event.broken).bold + " broken"); - event.errored && result.push($(event.errored).bold + " errored"); - event.pending && result.push($(event.pending).bold + " pending"); - - if (complete < event.total) { - result.push($(event.total - complete).bold + " dropped"); - } - - result = result.join(' ∙ '); - - header = { - honored: '✓ ' + $('OK').bold.green, - broken: '✗ ' + $('Broken').bold.yellow, - errored: '✗ ' + $('Errored').bold.red, - pending: '- ' + $('Pending').bold.cyan - }[status] + ' » '; - - if (typeof(event.time) === 'number') { - time = ' (' + event.time.toFixed(3) + 's)'; - time = this.stylize(time, 'grey'); - } - buffer.push(header + result + time + '\n'); - - return buffer; -}; - -this.inspect = function inspect(val) { - if (module.exports.nocolor) { - return eyes(val); - } - - return '\033[1m' + eyes(val) + '\033[22m'; -}; - -this.error = function (obj) { - var string = '✗ ' + $('Errored ').red + '» '; - string += $(obj.error).red.bold + '\n'; - string += (obj.context ? ' in ' + $(obj.context).red + '\n': ''); - string += ' in ' + $(obj.suite.subject).red + '\n'; - string += ' in ' + $(obj.suite._filename).red; - - return string; -}; - -this.contextText = function (event) { - return ' ' + event; -}; - -this.vowText = function (event) { - var buffer = []; - - buffer.push(' ' + { - honored: ' ✓ ', - broken: ' ✗ ', - errored: ' ✗ ', - pending: ' - ' - }[event.status] + this.stylize(event.title, ({ - honored: 'green', - broken: 'yellow', - errored: 'red', - pending: 'cyan' - })[event.status])); - - if (event.status === 'broken') { - buffer.push(' » ' + event.exception); - } else if (event.status === 'errored') { - if (event.exception.type === 'promise') { - buffer.push(' » ' + this.stylize("An unexpected error was caught: " + - this.stylize(event.exception.error, 'bold'), 'red')); - } else { - buffer.push(' ' + this.stylize(event.exception, 'red')); - } - } - return buffer.join('\n'); -}; diff --git a/node_modules/vows/lib/vows/context.js b/node_modules/vows/lib/vows/context.js deleted file mode 100644 index b11d676..0000000 --- a/node_modules/vows/lib/vows/context.js +++ /dev/null @@ -1,76 +0,0 @@ - -this.Context = function (vow, ctx, env) { - var that = this; - - this.tests = vow.callback; - this.topics = (ctx.topics || []).slice(0); - this.emitter = null; - this.env = env || {}; - this.env.context = this; - - this.env.callback = function (/* arguments */) { - var ctx = this; - var args = Array.prototype.slice.call(arguments); - - var emit = (function (args) { - // - // Convert callback-style results into events. - // - if (vow.batch.suite.options.error) { - return function () { - var e = args.shift(); - that.emitter.ctx = ctx; - // We handle a special case, where the first argument is a - // boolean, in which case we treat it as a result, and not - // an error. This is useful for `path.exists` and other - // functions like it, which only pass a single boolean - // parameter instead of the more common (error, result) pair. - if (typeof(e) === 'boolean' && args.length === 0) { - that.emitter.emit.call(that.emitter, 'success', e); - } else { - if (e) { that.emitter.emit.apply(that.emitter, ['error', e].concat(args)) } - else { that.emitter.emit.apply(that.emitter, ['success'].concat(args)) } - } - }; - } else { - return function () { - that.emitter.ctx = ctx; - that.emitter.emit.apply(that.emitter, ['success'].concat(args)); - }; - } - })(args.slice(0)); - // If `this.callback` is called synchronously, - // the emitter will not have been set yet, - // so we defer the emition, that way it'll behave - // asynchronously. - if (that.emitter) { emit() } - else { process.nextTick(emit) } - }; - this.name = vow.description; - // events is an alias for on - if (this.name === 'events') { - this.name = vow.description = 'on'; - } - - // if this is a sub-event context AND it's context was an event, - // then I must enforce event order. - // this will not do a good job of handling pin-pong events - if (this.name === 'on' && ctx.isEvent) { - this.after = ctx.name; - } - - if (ctx.name === 'on') { - this.isEvent = true; - this.event = this.name; - this.after = ctx.after; - } else { - this.isEvent = false; - this.event = 'success'; - } - - this.title = [ - ctx.title || '', - vow.description || '' - ].join(/^[#.:]/.test(vow.description) ? '' : ' ').trim(); -}; - diff --git a/node_modules/vows/lib/vows/coverage/file.js b/node_modules/vows/lib/vows/coverage/file.js deleted file mode 100644 index 5bdef90..0000000 --- a/node_modules/vows/lib/vows/coverage/file.js +++ /dev/null @@ -1,29 +0,0 @@ - -exports.coverage = function (filename, data) { - var ret = { - filename: filename, - coverage: 0, - hits: 0, - misses: 0, - sloc : 0 - }; - - var source = data.source; - ret.source = source.map(function (line, num) { - num++; - - if (data[num] === 0) { - ret.misses++; - ret.sloc++; - } else if (data[num] !== undefined) { - ret.hits++; - ret.sloc++; - } - - return { line: line, coverage: (data[num] === undefined ? '' : data[num]) }; - }); - - ret.coverage = (ret.hits / ret.sloc) * 100; - - return ret; -}; \ No newline at end of file diff --git a/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html b/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html deleted file mode 100644 index 9943ff0..0000000 --- a/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html +++ /dev/null @@ -1,3 +0,0 @@ -
- - diff --git a/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html b/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html deleted file mode 100644 index bd05d31..0000000 --- a/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - Coverage - - - - -
diff --git a/node_modules/vows/lib/vows/coverage/report-html.js b/node_modules/vows/lib/vows/coverage/report-html.js deleted file mode 100644 index 930a30b..0000000 --- a/node_modules/vows/lib/vows/coverage/report-html.js +++ /dev/null @@ -1,133 +0,0 @@ -/** -This software contains code adapted from Mocha -(https://github.com/visionmedia/mocha) by TJ Holowaychuk -and is used herein under the following MIT license: - -Copyright (c) 20011-2012 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -var util = require('util'), - path = require('path'), - fs = require('fs'), - file = require('./file'); - -this.name = 'coverage-report-html'; - -function getCoverageClass( data ) { - var highCoverage= (data.coverage >= 80); - var okCoverage= (!highCoverage && data.coverage >=60); - var coverageClass= ''; - if( highCoverage ) coverageClass= 'high'; - else if( okCoverage) coverageClass= 'medium'; - else coverageClass= 'low'; - return coverageClass; -} -this.report = function (coverageMap) { - var out, head, foot, - files = [], summary = { - hits: 0, - misses: 0, - sloc: 0 - }; - - try { - out = fs.openSync("coverage.html", "w"); - head = fs.readFileSync(__dirname + "/fragments/coverage-head.html", "utf8"); - foot = fs.readFileSync(__dirname + "/fragments/coverage-foot.html", "utf8"); - } catch (error) { - util.print("Error: Unable to write to file coverage.html\n"); - return; - } - - fs.writeSync(out, head); - - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var data = file.coverage(filename, coverageMap[filename]); - data.filename = filename; - files.push(data); - summary.hits += data.hits; - summary.misses += data.misses; - summary.sloc += data.sloc; - } - } - - summary.coverage = (summary.hits / summary.sloc) * 100; - - fs.writeSync(out, '

Coverage

'); - - fs.writeSync(out, '
' + - '
' + summary.hits + - '
' + summary.misses + - '
' + summary.sloc + - '
' + summary.coverage.toFixed(0) + "%
"); - - files.forEach(function (data) { - var coverageClass = getCoverageClass(data); - fs.writeSync(out, '
'); - fs.writeSync(out, '

' + data.filename + '

\n'); - fs.writeSync(out, '
' + - '
' + data.hits + - '
' + data.misses + - '
' + data.sloc + - '
' + data.coverage.toFixed(0) + "%
"); - - fs.writeSync(out, ''); - - for (var i = 0, l = data.source.length; i < l; i++) { - var line = data.source[i], - klass = (line.coverage === 0 ? 'miss' : 'hit'); - - fs.writeSync(out, ''); - } - - fs.writeSync(out, "
LineHitsSource
' + i + - '' + line.coverage + - '' + line.line + '
\n"); - fs.writeSync(out, "
\n"); - }); - - fs.writeSync(out, foot); - fs.close(out); -}; diff --git a/node_modules/vows/lib/vows/coverage/report-json.js b/node_modules/vows/lib/vows/coverage/report-json.js deleted file mode 100644 index bcbab25..0000000 --- a/node_modules/vows/lib/vows/coverage/report-json.js +++ /dev/null @@ -1,54 +0,0 @@ -var util = require('util'), - fs = require('fs'), - file = require('./file'); - -this.name = 'coverage-report-json'; - -this.report = function (coverageMap) { - var output = { - meta: { - "generator": "vowsjs", - "generated": new Date().toString(), - "instrumentation": "node-jscoverage", - "file-version": "1.0" - }, - files: [ ], - coverage: [ ] - }; - - - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var data = file.coverage(filename, coverageMap[filename]); - - var coverage = { - file: filename, - coverage: data.coverage.toFixed(2), - hits: data.hits, - misses: data.misses, - sloc: data.sloc, - source: { } - }; - - for (var i = 0; i < data.source.length; i++) { - coverage.source[i + 1] = { - line: data.source[i].line, - coverage: data.source[i].coverage - }; - } - - output.coverage.push(coverage); - - output.files.push(filename); - } - } - - try { - out = fs.openSync("coverage.json", "w"); - fs.writeSync(out, JSON.stringify(output)); - fs.close(out); - } catch (error) { - util.print("Error: Unable to write to file coverage.json\n"); - return; - } -}; diff --git a/node_modules/vows/lib/vows/coverage/report-plain.js b/node_modules/vows/lib/vows/coverage/report-plain.js deleted file mode 100644 index 9de7005..0000000 --- a/node_modules/vows/lib/vows/coverage/report-plain.js +++ /dev/null @@ -1,38 +0,0 @@ -var util = require('util'), - file = require('./file'); - -this.name = 'coverage-report-plain'; - -function lpad(str, width) { - str = String(str); - var n = width - str.length; - - if (n < 1) { - return str; - } - - while (n--) { - str = ' ' + str; - } - - return str; -} - - -this.report = function (coverageMap) { - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var data = file.coverage(filename, coverageMap[filename]); - - util.print(filename + ":\n"); - util.print("[ hits: " + data.hits + ", misses: " + data.misses); - util.print(", sloc: " + data.sloc + ", coverage: " + data.coverage.toFixed(2) + "% ]\n"); - - for (var i = 0; i < data.source.length; i++) { - util.print(lpad(data.source[i].coverage, 5) + " | " + data.source[i].line + "\n"); - } - - util.print("\n"); - } - } -}; diff --git a/node_modules/vows/lib/vows/coverage/report-xml.js b/node_modules/vows/lib/vows/coverage/report-xml.js deleted file mode 100644 index b9ff95b..0000000 --- a/node_modules/vows/lib/vows/coverage/report-xml.js +++ /dev/null @@ -1,81 +0,0 @@ -var fs = require('fs'), - file = require('./file'); - -this.name = 'coverage-report-xml'; - -this.report = function (coverageMap) { - var all = { - xml: '', - packages: 0, - files: 0, - lines: 0, - hits: 0 - }, - data = {}; - - // group data by path - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var pkg = (filename.indexOf('/') > 0) - ? filename.substr(0, filename.lastIndexOf('/')) - : filename; - if (!data[pkg]) { - data[pkg] = {}; - } - data[pkg][ (filename.indexOf('/')) - ? filename.substr(filename.lastIndexOf('/') + 1, filename.length) - : filename ] - = file.coverage(filename, coverageMap[filename]); - } - } - - // generate groups xml-fragment - for (var pkg in data) { - if (data.hasOwnProperty(pkg)) { - var pkgStat = { - xml: '', - files: 0, - lines: 0, - hits: 0 - }; - - all.xml += '\t\n'; - - for (var filename in data[pkg]) { - if (data[pkg].hasOwnProperty(filename)) { - pkgStat.files += 1; - pkgStat.lines += data[pkg][filename].sloc; - pkgStat.hits += data[pkg][filename].hits; - - pkgStat.xml += '\t\t\n' - + '\t\t\t\n' - + '\t\t\n'; - } - } - - all.packages += 1; - all.files += pkgStat.files; - all.lines += pkgStat.lines; - all.hits += pkgStat.hits; - - all.xml += '\t\t\n' - + pkgStat.xml - + '\t\n'; - } - } - - all.xml = '\n' - + '\n\n' - + '\t\n' - + '\t\n' - + '\t\n' - + '\t\n' - + '\t\n' - + '\n\n' - + '\n' - + '\t\n' - + all.xml - + '\n\n\n'; - - fs.writeFileSync('coverage.xml', all.xml); -}; diff --git a/node_modules/vows/lib/vows/extras.js b/node_modules/vows/lib/vows/extras.js deleted file mode 100644 index a90d7a5..0000000 --- a/node_modules/vows/lib/vows/extras.js +++ /dev/null @@ -1,28 +0,0 @@ -var events = require('events'); -// -// Wrap a Node.js style async function into an EventEmmitter -// -this.prepare = function (obj, targets) { - targets.forEach(function (target) { - if (target in obj) { - obj[target] = (function (fun) { - return function () { - var args = Array.prototype.slice.call(arguments); - var ee = new(events.EventEmitter); - - args.push(function (err /* [, data] */) { - var args = Array.prototype.slice.call(arguments, 1); - - if (err) { ee.emit.apply(ee, ['error', err].concat(args)) } - else { ee.emit.apply(ee, ['success'].concat(args)) } - }); - fun.apply(obj, args); - - return ee; - }; - })(obj[target]); - } - }); - return obj; -}; - diff --git a/node_modules/vows/lib/vows/reporters/dot-matrix.js b/node_modules/vows/lib/vows/reporters/dot-matrix.js deleted file mode 100644 index 0ecf590..0000000 --- a/node_modules/vows/lib/vows/reporters/dot-matrix.js +++ /dev/null @@ -1,67 +0,0 @@ -var options = { tail: '' }, - console = require('../../vows/console'), - stylize = console.stylize, - puts = console.puts(options); -// -// Console reporter -// -var messages = [], lastContext; - -this.name = 'dot-matrix'; -this.setStream = function (s) { - options.stream = s; -}; - -this.reset = function () { - messages = []; - lastContext = null; -}; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'subject': - // messages.push(stylize(event, 'underline') + '\n'); - break; - case 'context': - break; - case 'vow': - if (event.status === 'honored') { - puts(stylize('·', 'green')); - } else if (event.status === 'pending') { - puts(stylize('-', 'cyan')); - } else { - if (lastContext !== event.context) { - lastContext = event.context; - messages.push(' ' + event.context); - } - if (event.status === 'broken') { - puts(stylize('✗', 'yellow')); - messages.push(console.vowText(event)); - } else if (event.status === 'errored') { - puts(stylize('✗', 'red')); - messages.push(console.vowText(event)); - } - messages.push(''); - } - break; - case 'end': - puts(' '); - break; - case 'finish': - if (messages.length) { - puts('\n\n' + messages.join('\n')); - } else { - puts(''); - } - puts(console.result(event).join('\n')); - break; - case 'error': - puts(console.error(event)); - break; - } -}; - -this.print = function (str) { - puts(str); -}; diff --git a/node_modules/vows/lib/vows/reporters/json.js b/node_modules/vows/lib/vows/reporters/json.js deleted file mode 100644 index 20c1366..0000000 --- a/node_modules/vows/lib/vows/reporters/json.js +++ /dev/null @@ -1,33 +0,0 @@ -var options = { tail: '\n', raw: true }; -var console = require('../../vows/console'); -var puts = console.puts(options); - -// -// Console JSON reporter -// -this.name = 'json'; -this.setStream = function (s) { - options.stream = s; -}; - -function removeCircularSuite(obj, suite) { - var result = {}; - - if (typeof obj !== 'object' || obj === null) return obj; - - Object.keys(obj).forEach(function(key) { - if (obj[key] === suite) { - result[key] = {}; - } else { - result[key] = removeCircularSuite(obj[key], suite || obj.suite); - } - }); - - return result; -}; - -this.report = function (obj) { - puts(JSON.stringify(removeCircularSuite(obj))); -}; - -this.print = function (str) {}; diff --git a/node_modules/vows/lib/vows/reporters/silent.js b/node_modules/vows/lib/vows/reporters/silent.js deleted file mode 100644 index fe90a33..0000000 --- a/node_modules/vows/lib/vows/reporters/silent.js +++ /dev/null @@ -1,8 +0,0 @@ -// -// Silent reporter - "Shhh" -// -this.name = 'silent'; -this.reset = function () {}; -this.report = function () {}; -this.print = function () {}; - diff --git a/node_modules/vows/lib/vows/reporters/spec.js b/node_modules/vows/lib/vows/reporters/spec.js deleted file mode 100644 index d1c6dd8..0000000 --- a/node_modules/vows/lib/vows/reporters/spec.js +++ /dev/null @@ -1,42 +0,0 @@ -var util = require('util'); - -var options = { tail: '\n' }; -var console = require('../../vows/console'); -var stylize = console.stylize, - puts = console.puts(options); -// -// Console reporter -// - -this.name = 'spec'; -this.setStream = function (s) { - options.stream = s; -}; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'subject': - puts('\n♢ ' + stylize(event, 'bold') + '\n'); - break; - case 'context': - puts(console.contextText(event)); - break; - case 'vow': - puts(console.vowText(event)); - break; - case 'end': - util.print('\n'); - break; - case 'finish': - puts(console.result(event).join('\n')); - break; - case 'error': - puts(console.error(event)); - break; - } -}; - -this.print = function (str) { - util.print(str); -}; diff --git a/node_modules/vows/lib/vows/reporters/tap.js b/node_modules/vows/lib/vows/reporters/tap.js deleted file mode 100644 index ac5a2da..0000000 --- a/node_modules/vows/lib/vows/reporters/tap.js +++ /dev/null @@ -1,100 +0,0 @@ -var options = { - tail: "\n" -}; -var console = require("../console"); -var stylize = console.stylize; -var puts = console.puts(options); - -// -// TAP Reporter -// - -this.name = "tap"; -this.setSTream = function setStream(s) { - options.stream = s; -}; - -var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; -var TapInterface = (function() { - function TapInterface() { - this.genOutput_ = __bind(this.genOutput_, this); - this.testCount = __bind(this.testCount, this); - this.bailOut = __bind(this.bailOut, this); - this.skip = __bind(this.skip, this); - this.notOk = __bind(this.notOk, this); - this.ok = __bind(this.ok, this); - this.count_ = 0; - } - - TapInterface.prototype.ok = function(description) { - return this.genOutput_("ok", ++this.count_, "- " + description); - }; - - TapInterface.prototype.notOk = function(description) { - return this.genOutput_("not ok", ++this.count_, "- " + description); - }; - - TapInterface.prototype.skip = function(description) { - return this.genOutput_("ok", ++this.count_, "# SKIP " + description); - }; - - TapInterface.prototype.bailOut = function(reason) { - return "Bail out!" + (reason !== null ? " " + reason : ""); - }; - - TapInterface.prototype.testCount = function() { - return "1.." + this.count_; - }; - - TapInterface.prototype.genOutput_ = function(status, testNumber, description) { - return "" + status + " " + testNumber + " " + description; - }; - - return TapInterface; -})(); - -var tap = new TapInterface(); - -this.report = function report(data) { - var type = data[0]; - var event = data[1]; - switch (type) { - case "subject": - puts("# " + stylize(event, "bold")); - break; - case "context": - puts("# " + event); - break; - case "vow": - switch (event.status) { - case "honored": - puts(tap.ok(event.title)); - break; - case "pending": - puts(tap.skip(event.title)); - break; - case "broken": - puts(tap.notOk(event.title + "\n# " + event.exception)); - break; - case "errored": - puts(tap.notOk(event.title)); - puts(tap.bailOut(event.exception)); - break; - } - break; - case "end": - puts("\n"); - break; - case "finish": - puts(tap.testCount()); - break; - case "error": - puts("#> Errored"); - puts("# " + JSON.stringify(data)); - break; - } -}; - -this.print = function print(str) { - require("util").print(str); -}; diff --git a/node_modules/vows/lib/vows/reporters/watch.js b/node_modules/vows/lib/vows/reporters/watch.js deleted file mode 100644 index 58f6e3c..0000000 --- a/node_modules/vows/lib/vows/reporters/watch.js +++ /dev/null @@ -1,37 +0,0 @@ -var options = {}; -var console = require('../../vows/console'); -var spec = require('../../vows/reporters/spec'); -var stylize = console.stylize, - puts = console.puts(options); -// -// Console reporter -// -var lastContext; - -this.name = 'watch'; -this.setStream = function (s) { - options.stream = s; -}; -this.reset = function () { - lastContext = null; -}; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'vow': - if (['honored', 'pending'].indexOf(event.status) === -1) { - if (lastContext !== event.context) { - lastContext = event.context; - puts(console.contextText(event.context)); - } - puts(console.vowText(event)); - puts(''); - } - break; - case 'error': - puts(console.error(event)); - break; - } -}; -this.print = function (str) {}; diff --git a/node_modules/vows/lib/vows/reporters/xunit.js b/node_modules/vows/lib/vows/reporters/xunit.js deleted file mode 100644 index 411a948..0000000 --- a/node_modules/vows/lib/vows/reporters/xunit.js +++ /dev/null @@ -1,90 +0,0 @@ -// xunit outoput for vows, so we can run things under hudson -// -// The translation to xunit is simple. Most likely more tags/attributes can be -// added, see: http://ant.1045680.n5.nabble.com/schema-for-junit-xml-output-td1375274.html -// - -var puts = require('util').puts; - -var buffer = [], - curSubject = null; - -function xmlEnc(value) { - return !value ? value : String(value).replace(/&/g, "&") - .replace(/>/g, ">") - .replace(/'; -} - -function cdata(data) { - return ''; -} - -this.name = 'xunit'; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'subject': - curSubject = event; - break; - case 'context': - break; - case 'vow': - switch (event.status) { - case 'honored': - buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, true)); - break; - case 'broken': - var err = tag('error', {type: 'vows.event.broken', message: 'Broken test'}, false, cdata(event.exception)); - buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, false, err)); - break; - case 'errored': - var skip = tag('skipped', {type: 'vows.event.errored', message: 'Errored test'}, false, cdata(event.exception)); - buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, false, skip)); - break; - case 'pending': - // nop - break; - } - break; - case 'end': - buffer.push(end('testcase')); - break; - case 'finish': - buffer.unshift(tag('testsuite', {name: 'Vows test', tests: event.total, timestamp: (new Date()).toUTCString(), errors: event.errored, failures: event.broken, skip: event.pending, time: event.time})); - buffer.push(end('testsuite')); - puts(buffer.join('\n')); - break; - case 'error': - break; - } -}; - -this.print = function (str) { }; diff --git a/node_modules/vows/lib/vows/suite.js b/node_modules/vows/lib/vows/suite.js deleted file mode 100644 index e2c2423..0000000 --- a/node_modules/vows/lib/vows/suite.js +++ /dev/null @@ -1,386 +0,0 @@ -var events = require('events'), - path = require('path'); - -var vows = require('../vows'); -var Context = require('../vows/context').Context; - -this.Suite = function (subject) { - this.subject = subject; - this.matcher = /.*/; - this.reporter = require('./reporters/dot-matrix'); - this.batches = []; - this.options = { error: true }; - this.reset(); -}; - -this.Suite.prototype = new(function () { - this.reset = function () { - this.results = { - honored: 0, - broken: 0, - errored: 0, - pending: 0, - total: 0, - time: null - }; - this.batches.forEach(function (b) { - b.lastContext = null; - b.remaining = b._remaining; - b.honored = b.broken = b.errored = b.total = b.pending = 0; - b.vows.forEach(function (vow) { vow.status = null }); - b.teardowns = []; - }); - }; - - this.addBatch = function (tests) { - this.batches.push({ - tests: tests, - suite: this, - vows: [], - remaining: 0, - _remaining: 0, - honored: 0, - broken: 0, - errored: 0, - pending: 0, - total: 0, - teardowns: [] - }); - return this; - }; - this.addVows = this.addBatch; - - this.parseBatch = function (batch, matcher) { - var tests = batch.tests; - - if ('topic' in tests) { - throw new(Error)("missing top-level context."); - } - // Count the number of vows/promises expected to fire, - // so we know when the tests are over. - // We match the keys against `matcher`, to decide - // whether or not they should be included in the test. - // Any key, including assertion function keys can be matched. - // If a child matches, then the n parent topics must not be skipped. - (function count(tests, _match) { - var match = false; - - var keys = Object.keys(tests).filter(function (k) { - return k !== 'topic' && k !== 'teardown'; - }); - - for (var i = 0, key; i < keys.length; i++) { - key = keys[i]; - - // If the parent node, or this one matches. - match = _match || matcher.test(key); - - if (typeof(tests[key]) === 'object') { - match = count(tests[key], match); - } else { - if (typeof(tests[key]) === 'string') { - tests[key] = new(String)(tests[key]); - } - if (! match) { - tests[key]._skip = true; - } - } - } - - // If any of the children matched, - // don't skip this node. - for (var i = 0; i < keys.length; i++) { - if (! tests[keys[i]]._skip) { match = true } - } - - if (match) { batch.remaining ++ } - else { tests._skip = true } - - return match; - })(tests, false); - - batch._remaining = batch.remaining; - }; - - this.runBatch = function (batch) { - var topic, - tests = batch.tests, - promise = batch.promise = new(events.EventEmitter); - - var that = this; - - batch.status = 'begin'; - - // The test runner, it calls itself recursively, passing the - // previous context to the inner contexts. This is so the `topic` - // functions have access to all the previous context topics in their - // arguments list. - // It is defined and invoked at the same time. - // If it encounters a `topic` function, it waits for the returned - // promise to emit (the topic), at which point it runs the functions under it, - // passing the topic as an argument. - (function run(ctx, lastTopic) { - var old = false; - topic = ctx.tests.topic; - - if (typeof(topic) === 'function') { - if (ctx.isEvent || ctx.name === 'on') { - throw new Error('Event context cannot contain a topic'); - } - - // Run the topic, passing the previous context topics - // If topic `throw`s an exception, pass it down as a value - try { - topic = topic.apply(ctx.env, ctx.topics); - } - catch (ex) { - topic = ex; - } - - if (typeof(topic) === 'undefined') { ctx._callback = true } - } - - // If this context has a topic, store it in `lastTopic`, - // if not, use the last topic, passed down by a parent - // context. - if (typeof(topic) !== 'undefined' || ctx._callback) { - lastTopic = topic; - } else { - old = true; - topic = lastTopic; - } - - // If the topic doesn't return an event emitter (such as a promise), - // we create it ourselves, and emit the value on the next tick. - if (! (topic && - topic.constructor === events.EventEmitter)) { - // If the context is a traditional vow, then a topic can ONLY - // be an EventEmitter. However if the context is a sub-event - // then the topic may be an instanceof EventEmitter - if (!ctx.isEvent || - (ctx.isEvent && !(topic instanceof events.EventEmitter))) { - - ctx.emitter = new(events.EventEmitter); - - if (! ctx._callback) { - process.nextTick(function (val) { - return function () { - ctx.emitter.emit("success", val) - }; - }(topic)); - } - // if I have a callback, push the new topic back up to - // lastTopic - if (ctx._callback) { - lastTopic = topic = ctx.emitter; - } else { - topic = ctx.emitter; - } - } - } - - topic.on(ctx.event, function (val) { - // Once the topic fires, add the return value - // to the beginning of the topics list, so it - // becomes the first argument for the next topic. - // If we're using the parent topic, no need to - // prepend it to the topics list, or we'll get - // duplicates. - if (!old || ctx.isEvent) { - Array.prototype.unshift.apply(ctx.topics, arguments) - }; - }); - if (topic.setMaxListeners) { topic.setMaxListeners(Infinity) } - // Now run the tests, or sub-contexts - Object.keys(ctx.tests).filter(function (k) { - return ctx.tests[k] && k !== 'topic' && - k !== 'teardown' && !ctx.tests[k]._skip; - }).forEach(function (item) { - // Create a new evaluation context, - // inheriting from the parent one. - var env = Object.create(ctx.env); - env.suite = that; - - // Holds the current test or context - var vow = Object.create({ - callback: ctx.tests[item], - context: ctx.title, - description: item, - binding: ctx.env, - status: null, - batch: batch - }); - - // If we encounter a function, add it to the callbacks - // of the `topic` function, so it'll get called once the - // topic fires. - // If we encounter an object literal, we recurse, sending it - // our current context. - if ((typeof(vow.callback) === 'function') || - (vow.callback instanceof String)) { - topic.addVow(vow); - } else if (typeof(vow.callback) === 'object') { - // If there's a setup stage, we have to wait for it to fire, - // before calling the inner context. - // If the event has already fired, the context is 'on' or - // there is no setup stage, just run the inner context - // synchronously. - if (topic && - ctx.name !== 'on' && - !topic._vowsEmitedEvents.hasOwnProperty(ctx.event)) { - topic.on(ctx.event, function (ctx) { - return function (val) { - return run(new(Context)(vow, ctx, env), lastTopic); - }; - }(ctx)); - } else { - run(new(Context)(vow, ctx, env), lastTopic); - } - } - }); - // Teardown - if (ctx.tests.teardown) { - batch.teardowns.push(ctx); - } - if (! ctx.tests._skip) { - batch.remaining --; - } - // Check if we're done running the tests - exports.tryEnd(batch); - // This is our initial, empty context - })(new(Context)({ callback: tests, context: null, description: null }, {})); - return promise; - }; - - this.report = function () { - return this.reporter.report.apply(this.reporter, arguments); - }; - - this.run = function (options, callback) { - var that = this, start; - - options = options || {}; - - Object.keys(options).forEach(function (k) { - that.options[k] = options[k]; - }); - - this.matcher = this.options.matcher || this.matcher; - this.reporter = this.options.reporter || this.reporter; - - this.batches.forEach(function (batch) { - that.parseBatch(batch, that.matcher); - }); - - this.reset(); - - start = new(Date); - - if (this.batches.filter(function (b) { return b.remaining > 0 }).length) { - this.report(['subject', this.subject]); - } - - return (function run(batches) { - var batch = batches.shift(); - - if (batch) { - // If the batch has no vows to run, - // go to the next one. - if (batch.remaining === 0) { - run(batches); - } else { - that.runBatch(batch).on('end', function () { - run(batches); - }); - } - } else { - that.results.time = (new(Date) - start) / 1000; - that.report(['finish', that.results]); - - if (callback) { callback(that.results) } - - if (that.results.honored + that.results.pending === that.results.total) { - return 0; - } else { - return 1; - } - } - })(this.batches.slice(0)); - }; - - this.runParallel = function () {}; - - this.export = function (module, options) { - var that = this; - - Object.keys(options || {}).forEach(function (k) { - that.options[k] = options[k]; - }); - - if (require.main === module) { - return this.run(); - } else { - return module.exports[this.subject] = this; - } - }; - this.exportTo = function (module, options) { // Alias, for JSLint - return this.export(module, options); - }; -}); - -// -// Checks if all the tests in the batch have been run, -// and triggers the next batch (if any), by emitting the 'end' event. -// -this.tryEnd = function (batch) { - var result, style, time; - - if (batch.honored + batch.broken + batch.errored + batch.pending === batch.total && - batch.remaining === 0) { - - Object.keys(batch).forEach(function (k) { - (k in batch.suite.results) && (batch.suite.results[k] += batch[k]); - }); - - if (batch.teardowns) { - for (var i = batch.teardowns.length - 1, ctx; i >= 0; i--) { - runTeardown(batch.teardowns[i]); - } - - maybeFinish(); - } - - function runTeardown(teardown) { - var env = Object.create(teardown.env); - - Object.defineProperty(env, "callback", { - get: function () { - teardown.awaitingCallback = true; - - return function () { - teardown.awaitingCallback = false; - maybeFinish(); - }; - } - }); - - teardown.tests.teardown.apply(env, teardown.topics); - } - - function maybeFinish() { - var pending = batch.teardowns.filter(function (teardown) { - return teardown.awaitingCallback; - }); - - if (pending.length === 0) { - finish(); - } - } - - function finish() { - batch.status = 'end'; - batch.suite.report(['end']); - batch.promise.emit('end', batch.honored, batch.broken, batch.errored, batch.pending); - } - } -}; diff --git a/node_modules/vows/node_modules/diff/LICENSE b/node_modules/vows/node_modules/diff/LICENSE deleted file mode 100644 index c135dcf..0000000 --- a/node_modules/vows/node_modules/diff/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Software License Agreement (BSD License) - -Copyright (c) 2009-2011, Kevin Decker - -All rights reserved. - -Redistribution and use of this software in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of Kevin Decker nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/node_modules/vows/node_modules/diff/README.md b/node_modules/vows/node_modules/diff/README.md deleted file mode 100644 index 2ed7ee1..0000000 --- a/node_modules/vows/node_modules/diff/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# jsdiff - -A javascript text differencing implementation. - -Based on the algorithm proposed in -["An O(ND) Difference Algorithm and its Variations" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927). - -## Installation - - npm install diff - -or - - git clone git://github.com/kpdecker/jsdiff.git - -## API - -* JsDiff.diffChars(oldStr, newStr) - Diffs two blocks of text, comparing character by character. - - Returns a list of change objects (See below). - -* JsDiff.diffWords(oldStr, newStr) - Diffs two blocks of text, comparing word by word. - - Returns a list of change objects (See below). - -* JsDiff.diffLines(oldStr, newStr) - Diffs two blocks of text, comparing line by line. - - Returns a list of change objects (See below). - -* JsDiff.diffCss(oldStr, newStr) - Diffs two blocks of text, comparing CSS tokens. - - Returns a list of change objects (See below). - -* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader) - Creates a unified diff patch. - - Parameters: - * fileName : String to be output in the filename sections of the patch - * oldStr : Original string value - * newStr : New string value - * oldHeader : Additional information to include in the old file header - * newHeader : Additional information to include in thew new file header - -* convertChangesToXML(changes) - Converts a list of changes to a serialized XML format - -### Change Objects -Many of the methods above return change objects. These objects are consist of the following fields: - -* value: Text content -* added: True if the value was inserted into the new string -* removed: True of the value was removed from the old string - -Note that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner. - -## [Example](http://kpdecker.github.com/jsdiff) - -## License - -Software License Agreement (BSD License) - -Copyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com - -All rights reserved. - -Redistribution and use of this software in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of Kevin Decker nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/vows/node_modules/diff/diff.js b/node_modules/vows/node_modules/diff/diff.js deleted file mode 100644 index 8e6a1c0..0000000 --- a/node_modules/vows/node_modules/diff/diff.js +++ /dev/null @@ -1,296 +0,0 @@ -/* See license.txt for terms of usage */ - -/* - * Text diff implementation. - * - * This library supports the following APIS: - * JsDiff.diffChars: Character by character diff - * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace - * JsDiff.diffLines: Line based diff - * - * JsDiff.diffCss: Diff targeted at CSS content - * - * These methods are based on the implementation proposed in - * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). - * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - */ -var JsDiff = (function() { - function clonePath(path) { - return { newPos: path.newPos, components: path.components.slice(0) }; - } - function removeEmpty(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - if (array[i]) { - ret.push(array[i]); - } - } - return ret; - } - function escapeHTML(s) { - var n = s; - n = n.replace(/&/g, "&"); - n = n.replace(//g, ">"); - n = n.replace(/"/g, """); - - return n; - } - - - var fbDiff = function(ignoreWhitespace) { - this.ignoreWhitespace = ignoreWhitespace; - }; - fbDiff.prototype = { - diff: function(oldString, newString) { - // Handle the identity case (this is due to unrolling editLength == 0 - if (newString == oldString) { - return [{ value: newString }]; - } - if (!newString) { - return [{ value: oldString, removed: true }]; - } - if (!oldString) { - return [{ value: newString, added: true }]; - } - - newString = this.tokenize(newString); - oldString = this.tokenize(oldString); - - var newLen = newString.length, oldLen = oldString.length; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; - - // Seed editLength = 0 - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { - return bestPath[0].components; - } - - for (var editLength = 1; editLength <= maxEditLength; editLength++) { - for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { - var basePath; - var addPath = bestPath[diagonalPath-1], - removePath = bestPath[diagonalPath+1]; - oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath-1] = undefined; - } - - var canAdd = addPath && addPath.newPos+1 < newLen; - var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; - if (!canAdd && !canRemove) { - bestPath[diagonalPath] = undefined; - continue; - } - - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { - basePath = clonePath(removePath); - this.pushComponent(basePath.components, oldString[oldPos], undefined, true); - } else { - basePath = clonePath(addPath); - basePath.newPos++; - this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); - } - - var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); - - if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { - return basePath.components; - } else { - bestPath[diagonalPath] = basePath; - } - } - } - }, - - pushComponent: function(components, value, added, removed) { - var last = components[components.length-1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length-1] = - {value: this.join(last.value, value), added: added, removed: removed }; - } else { - components.push({value: value, added: added, removed: removed }); - } - }, - extractCommon: function(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath; - while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { - newPos++; - oldPos++; - - this.pushComponent(basePath.components, newString[newPos], undefined, undefined); - } - basePath.newPos = newPos; - return oldPos; - }, - - equals: function(left, right) { - var reWhitespace = /\S/; - if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { - return true; - } else { - return left == right; - } - }, - join: function(left, right) { - return left + right; - }, - tokenize: function(value) { - return value; - } - }; - - var CharDiff = new fbDiff(); - - var WordDiff = new fbDiff(true); - WordDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\s+|\b)/)); - }; - - var CssDiff = new fbDiff(true); - CssDiff.tokenize = function(value) { - return removeEmpty(value.split(/([{}:;,]|\s+)/)); - }; - - var LineDiff = new fbDiff(); - LineDiff.tokenize = function(value) { - return value.split(/^/m); - }; - - return { - diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, - diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, - diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, - - diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, - - createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { - var ret = []; - - ret.push("Index: " + fileName); - ret.push("==================================================================="); - ret.push("--- " + fileName + (typeof oldHeader === "undefined" ? "" : "\t" + oldHeader)); - ret.push("+++ " + fileName + (typeof newHeader === "undefined" ? "" : "\t" + newHeader)); - - var diff = LineDiff.diff(oldStr, newStr); - if (!diff[diff.length-1].value) { - diff.pop(); // Remove trailing newline add - } - diff.push({value: "", lines: []}); // Append an empty value to make cleanup easier - - function contextLines(lines) { - return lines.map(function(entry) { return ' ' + entry; }); - } - function eofNL(curRange, i, current) { - var last = diff[diff.length-2], - isLast = i === diff.length-2, - isLastOfType = i === diff.length-3 && (current.added === !last.added || current.removed === !last.removed); - - // Figure out if this is the last line for the given file and missing NL - if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { - curRange.push('\\ No newline at end of file'); - } - } - - var oldRangeStart = 0, newRangeStart = 0, curRange = [], - oldLine = 1, newLine = 1; - for (var i = 0; i < diff.length; i++) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, "").split("\n"); - current.lines = lines; - - if (current.added || current.removed) { - if (!oldRangeStart) { - var prev = diff[i-1]; - oldRangeStart = oldLine; - newRangeStart = newLine; - - if (prev) { - curRange = contextLines(prev.lines.slice(-4)); - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } - curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?"+":"-") + entry; })); - eofNL(curRange, i, current); - - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= 8 && i < diff.length-2) { - // Overlapping - curRange.push.apply(curRange, contextLines(lines)); - } else { - // end the range and output - var contextSize = Math.min(lines.length, 4); - ret.push( - "@@ -" + oldRangeStart + "," + (oldLine-oldRangeStart+contextSize) - + " +" + newRangeStart + "," + (newLine-newRangeStart+contextSize) - + " @@"); - ret.push.apply(ret, curRange); - ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); - if (lines.length <= 4) { - eofNL(ret, i, current); - } - - oldRangeStart = 0; newRangeStart = 0; curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } - } - - return ret.join('\n') + '\n'; - }, - - convertChangesToXML: function(changes){ - var ret = []; - for ( var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push(""); - } else if (change.removed) { - ret.push(""); - } - - ret.push(escapeHTML(change.value)); - - if (change.added) { - ret.push(""); - } else if (change.removed) { - ret.push(""); - } - } - return ret.join(""); - }, - - convertChangesToDMP: function(changes){ - var ret = [], change; - for ( var i = 0; i < changes.length; i++) { - change = changes[i]; - ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); - } - return ret; - } - }; -})(); - -if (typeof module !== "undefined") { - module.exports = JsDiff; -} diff --git a/node_modules/vows/node_modules/diff/index.html b/node_modules/vows/node_modules/diff/index.html deleted file mode 100644 index ecb22fa..0000000 --- a/node_modules/vows/node_modules/diff/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Diff - - - - -
-

Diff

- - - -
- -github.com/kpdecker/jsdiff - - - - - - - -
restaurantaura
- - - - - diff --git a/node_modules/vows/node_modules/diff/package.json b/node_modules/vows/node_modules/diff/package.json deleted file mode 100644 index cee7139..0000000 --- a/node_modules/vows/node_modules/diff/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "diff", - "version": "1.0.3", - "description": "A javascript text diff implementation.", - "keywords": [ - "diff", - "javascript" - ], - "maintainers": [ - { - "name": "Kevin Decker", - "email": "kpdecker@gmail.com", - "url": "http://incaseofstairs.com" - } - ], - "bugs": { - "email": "kpdecker@gmail.com", - "url": "http://github.com/kpdecker/jsdiff/issues" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://github.com/kpdecker/jsdiff/blob/master/LICENSE" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/kpdecker/jsdiff.git" - }, - "engines": { - "node": ">=0.3.1" - }, - "main": "./diff", - "scripts": { - "test": "expresso test/*" - }, - "dependencies": {}, - "devDependencies": {}, - "readme": "# jsdiff\n\nA javascript text differencing implementation.\n\nBased on the algorithm proposed in\n[\"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927).\n\n## Installation\n\n npm install diff\n\nor\n\n git clone git://github.com/kpdecker/jsdiff.git\n\n## API\n\n* JsDiff.diffChars(oldStr, newStr)\n Diffs two blocks of text, comparing character by character.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffWords(oldStr, newStr)\n Diffs two blocks of text, comparing word by word.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffLines(oldStr, newStr)\n Diffs two blocks of text, comparing line by line.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffCss(oldStr, newStr)\n Diffs two blocks of text, comparing CSS tokens.\n\n Returns a list of change objects (See below).\n\n* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader)\n Creates a unified diff patch.\n\n Parameters:\n * fileName : String to be output in the filename sections of the patch\n * oldStr : Original string value\n * newStr : New string value\n * oldHeader : Additional information to include in the old file header\n * newHeader : Additional information to include in thew new file header\n\n* convertChangesToXML(changes)\n Converts a list of changes to a serialized XML format\n\n### Change Objects\nMany of the methods above return change objects. These objects are consist of the following fields:\n\n* value: Text content\n* added: True if the value was inserted into the new string\n* removed: True of the value was removed from the old string\n\nNote that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner.\n\n## [Example](http://kpdecker.github.com/jsdiff)\n\n## License\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n copyright notice, this list of conditions and the\n following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the\n following disclaimer in the documentation and/or other\n materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n contributors may be used to endorse or promote products\n derived from this software without specific prior\n written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n", - "_id": "diff@1.0.3", - "_from": "diff@~1.0.3" -} diff --git a/node_modules/vows/node_modules/diff/style.css b/node_modules/vows/node_modules/diff/style.css deleted file mode 100644 index 2047e2d..0000000 --- a/node_modules/vows/node_modules/diff/style.css +++ /dev/null @@ -1,81 +0,0 @@ -* { - margin: 0; - padding: 0; -} -html, body { - background: #EEE; - font: 12px sans-serif; -} -body { - padding-top: 1.8em; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html, body, table, tbody, tr, td { - height: 100% -} -table { - table-layout: fixed; - width: 100%; -} -td { - width: 33%; - padding: 3px 4px; - border: 1px solid transparent; - vertical-align: top; - font: 1em monospace; - text-align: left; - white-space: pre-wrap; -} -h1 { - display: inline; - font-size: 100%; -} -del { - text-decoration: none; - color: #b30000; - background: #fadad7; -} -ins { - background: #eaf2c2; - color: #406619; - text-decoration: none; -} - -#settings { - position: absolute; - top: 0; - left: 5px; - right: 5px; - height: 2em; - line-height: 2em; -} -#settings label { - margin-left: 1em; -} - -.source { - position: absolute; - right: 1%; - top: .2em; -} - -[contentEditable] { - background: #F9F9F9; - border-color: #BBB #D9D9D9 #DDD; - border-radius: 4px; - -webkit-user-modify: read-write-plaintext-only; - outline: none; -} -[contentEditable]:focus { - background: #FFF; - border-color: #6699cc; - box-shadow: 0 0 4px #2175c9; -} - -@-moz-document url-prefix() { - body { - height: 99%; /* Hide scroll bar in Firefox */ - } -} diff --git a/node_modules/vows/node_modules/diff/test/diffTest.js b/node_modules/vows/node_modules/diff/test/diffTest.js deleted file mode 100644 index 62d915d..0000000 --- a/node_modules/vows/node_modules/diff/test/diffTest.js +++ /dev/null @@ -1,625 +0,0 @@ -const VERBOSE = false; - -var assert = require('assert'), - diff = require('../diff'); - -function log() { - VERBOSE && console.log.apply(console, arguments); -} - -exports['Whitespace diff'] = function() { - diffResult = diff.diffWords("New Value", "New ValueMoreData"); - assert.equal( - "New ValueMoreDataValue", - diff.convertChangesToXML(diffResult), - "Single whitespace diffResult Value"); - - diffResult = diff.diffWords("New Value ", "New ValueMoreData "); - assert.equal( - "New ValueMoreDataValue ", - diff.convertChangesToXML(diffResult), - "Multiple whitespace diffResult Value"); -}; - -// Diff on word boundary -exports['Word Diff'] = function() { - diffResult = diff.diffWords("New :Value:Test", "New ValueMoreData "); - assert.equal( - "New ValueMoreData :Value:Test", - diff.convertChangesToXML(diffResult), - "Nonmatching word boundary diffResult Value"); - diffResult = diff.diffWords("New Value:Test", "New Value:MoreData "); - assert.equal( - "New Value:MoreData Test", - diff.convertChangesToXML(diffResult), - "Word boundary diffResult Value"); - diffResult = diff.diffWords("New Value-Test", "New Value:MoreData "); - assert.equal( - "New Value:MoreData -Test", - diff.convertChangesToXML(diffResult), - "Uninque boundary diffResult Value"); - diffResult = diff.diffWords("New Value", "New Value:MoreData "); - assert.equal( - "New Value:MoreData ", - diff.convertChangesToXML(diffResult), - "Word boundary diffResult Value"); -}; - -// Diff without changes -exports['Diff without changes'] = function() { - diffResult = diff.diffWords("New Value", "New Value"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "No changes diffResult Value"); - diffResult = diff.diffWords("New Value", "New Value"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "No changes whitespace diffResult Value"); - diffResult = diff.diffWords("", ""); - assert.equal( - "", - diff.convertChangesToXML(diffResult), - "Empty no changes diffResult Value"); -}; - -// Empty diffs -exports['Empty diffs'] = function() { - diffResult = diff.diffWords("New Value", ""); - assert.equal(1, diffResult.length, "Empty diff result length"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "Empty diffResult Value"); - diffResult = diff.diffWords("", "New Value"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "Empty diffResult Value"); -}; - -// With without anchor (the Heckel algorithm error case) -exports['No anchor'] = function() { - diffResult = diff.diffWords("New Value New Value", "Value Value New New"); - assert.eql( - "ValueNew Value New NewValue", - diff.convertChangesToXML(diffResult), - "No anchor diffResult Value"); -}; - -// CSS Diff -exports['CSS diffs'] = function() { - diffResult = diff.diffCss( - ".test,#value .test{margin-left:50px;margin-right:-40px}", - ".test2, #value2 .test {\nmargin-top:50px;\nmargin-right:-400px;\n}"); - assert.equal( - ".test2.test,#value #value2 .test {\n" - + "margin-topmargin-left:50px;\n" - + "margin-right:-400px;\n-40px}", - diff.convertChangesToXML(diffResult), - "CSS diffResult Value"); -}; - -// Line Diff -exports['Line diffs'] = function() { - diffResult = diff.diffLines( - "line\nold value\nline", - "line\nnew value\nline"); - assert.equal( - "line\nnew value\nold value\nline", - diff.convertChangesToXML(diffResult), - "Line diffResult Value"); - diffResult = diff.diffLines( - "line\nvalue\nline", - "line\nvalue\nline"); - assert.equal( - "line\nvalue\nline", - diff.convertChangesToXML(diffResult), - "Line same diffResult Value"); - diffResult = diff.diffLines( - "line\nvalue \nline", - "line\nvalue\nline"); - log("diffResult", diffResult); - log("diffResult", diff.convertChangesToXML(diffResult)); - assert.equal( - "line\nvalue\nvalue \nline", - diff.convertChangesToXML(diffResult), - "Line whitespace diffResult Value"); -}; - -// Patch creation with diff at EOF -exports['lastLineChanged'] = function() { - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,3 +1,4 @@\n' - + ' line2\n' - + ' line3\n' - + '+line4\n' - + ' line5\n', - diff.createPatch('test', 'line2\nline3\nline5\n', 'line2\nline3\nline4\nline5\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,3 +1,4 @@\n' - + ' line2\n' - + ' line3\n' - + ' line4\n' - + '+line5\n', - diff.createPatch('test', 'line2\nline3\nline4\n', 'line2\nline3\nline4\nline5\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line44\n' - + '-line4\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline44\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,5 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line44\n' - + '+line5\n' - + '-line4\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline44\nline5\n', 'header1', 'header2')); -}; - -exports['EOFNL'] = function() { - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line4\n' - + '\\ No newline at end of file\n' - + '-line4\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline4', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line4\n' - + '-line4\n' - + '\\ No newline at end of file\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4', 'line1\nline2\nline3\nline4\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + '+line1\n' - + '-line11\n' - + ' line2\n' - + ' line3\n' - + ' line4\n' - + '\\ No newline at end of file\n', - diff.createPatch('test', 'line11\nline2\nline3\nline4', 'line1\nline2\nline3\nline4', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,5 +1,5 @@\n' - + '+line1\n' - + '-line11\n' - + ' line2\n' - + ' line3\n' - + ' line4\n' - + ' line4\n', - diff.createPatch('test', 'line11\nline2\nline3\nline4\nline4\nline4\nline4', 'line1\nline2\nline3\nline4\nline4\nline4\nline4', 'header1', 'header2')); -}; - -exports['Large Test'] = function() { - var random = 42; - var mult = 134775813, range = Math.pow(2, 32); - function nextRandom() { - random = ((random * mult) + 1) % range; - return random; - } - var largeTest = ".hbh9asgiidc {ehaahc9:ses;bhg9hc:ses;idgaag-hi9aa:cdca;ihgd9gdgca-gdadg:ighchehgaci;ggghdg:edhciag;daagsada:ahhhiaa;ahai7:hgid;}.hbh9asgiidc.hchgihaa {ggghdg:hgid;}.igiidchbh9ah {ihgd9gdgca-hbh9a:gga(" - + "hbh9ah/igiidcfhbh9ah.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7des;bhg9hc-gh97i:ses;ahai7:7des;ihgd9gdgca-edhhihdc:ses ses;}.igiidcfgde9 {ihgd9gdgca-edhhihdc:ses ses;}.bdghadaag .igiidcfgde9 {ihgd9gdgc" - + "a-edhhihdc:-7des ses;}.hchgihaa .igiidcfgde9 {ihgd9gdgca-edhhihdc:-dses ses;}.igiidcfaaaaia {ihgd9gdgca-edhhihdc:-bdes ses;}.bdghadaag .igiidcfaaaaia {ihgd9gdgca-edhhihdc:-9sses ses;}.hchgihaa .igiidc" - + "faaaaia {ihgd9gdgca-edhhihdc:-97des ses;}.igiidcfadacadha {ihgd9gdgca-edhhihdc:-9dses ses;}.bdghadaag .igiidcfadacadha {ihgd9gdgca-edhhihdc:-9bdes ses;}.hchgihaa .igiidcfadacadha {ihgd9gdgca-edhhihdc:" - + "-7sses ses;}.igiidcfabhha {ihgd9gdgca-edhhihdc:-77des ses;}.bdghadaag .igiidcfabhha {ihgd9gdgca-edhhihdc:-7dses ses;}.hchgihaa .igiidcfabhha {ihgd9gdgca-edhhihdc:-7bdes ses;}.igiidcfbdaa {ihgd9gdgca-e" - + "dhhihdc:-d7des ses;}.bdghadaag .igiidcfbdaa {ihgd9gdgca-edhhihdc:-ddses ses;}.hchgihaa .igiidcfbdaa {ihgd9gdgca-edhhihdc:-dbdes ses;}.igiidcfcaasdaaag {ihgd9gdgca-edhhihdc:-abdes ses;}.bdghadaag .igii" - + "dcfcaasdaaag {ihgd9gdgca-edhhihdc:-bsses ses;}.hchgihaa .igiidcfcaasdaaag {ihgd9gdgca-edhhihdc:-b7des ses;}.igiidcfgachba {ihgd9gdgca-edhhihdc:-dbdes ses;}.bdghadaag .igiidcfgachba {ihgd9gdgca-edhhihd" - + "c:-9ssses ses;}.hchgihaa .igiidcfgachba {ihgd9gdgca-edhhihdc:-9s7des ses;}.igiidcfghh {ihgd9gdgca-edhhihdc:-9sdses ses;}.bdghadaag .igiidcfghh {ihgd9gdgca-edhhihdc:-9sbdes ses;}.hchgihaa .igiidcfghh {" - + "ihgd9gdgca-edhhihdc:-99sses ses;}.igiidcfh7hga {ihgd9gdgca-edhhihdc:-97bdes ses;}.bdghadaag .igiidcfh7hga {ihgd9gdgca-edhhihdc:-9hsses ses;}.hchgihaa .igiidcfh7hga {ihgd9gdgca-edhhihdc:-9h7des ses;}.i" - + "giidcfgeadha {ihgd9gdgca-edhhihdc:-9hdses ses;}.bdghadaag .igiidcfgeadha {ihgd9gdgca-edhhihdc:-9hbdes ses;}.hchgihaa .igiidcfgeadha {ihgd9gdgca-edhhihdc:-9gsses ses;}.igiidcfaaisdaaag {ihgd9gdgca-edhh" - + "ihdc:-9dsses ses;}.bdghadaag .igiidcfaaisdaaag {ihgd9gdgca-edhhihdc:-9d7des ses;}.hchgihaa .igiidcfaaisdaaag {ihgd9gdgca-edhhihdc:-9ddses ses;}.igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-hsses ses;}.bdgh" - + "adaag .igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-h7des ses;}.hchgihaa .igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-hdses ses;}.igiidcfadgd {ihgd9gdgca-edhhihdc:-hbdes ses;}.bdghadaag .igiidcfadgd {ihgd9gdgc" - + "a-edhhihdc:-gsses ses;}.hchgihaa .igiidcfadgd {ihgd9gdgca-edhhihdc:-g7des ses;}.igiidcfbhch9a {ihgd9gdgca-edhhihdc:-gdses ses;}.bdghadaag .igiidcfbhch9a {ihgd9gdgca-edhhihdc:-gbdes ses;}.hchgihaa .igi" - + "idcfbhch9a {ihgd9gdgca-edhhihdc:-dsses ses;}.igiidcfcaaahdh {ihgd9gdgca-edhhihdc:-bdses ses;}.bdghadaag .igiidcfcaaahdh {ihgd9gdgca-edhhihdc:-bbdes ses;}.hchgihaa .igiidcfcaaahdh {ihgd9gdgca-edhhihdc:" - + "-csses ses;}.igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:-97sses ses;}.bdghadaag .igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:-977des ses;}.hchgihaa .igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:" - + "-97dses ses;}.igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-997des ses;}.bdghadaag .igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-99dses ses;}.hchgihaa .igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-99bdes ses;}.igiidc" - + "fcaaidddbhgd {ihgd9gdgca-edhhihdc:-asses ses;}.bdghadaag .igiidcfcaaidddbhgd {ihgd9gdgca-edhhihdc:-a7des ses;}.hchgihaa .igiidcfcaaidddbhgd {ihgd9gdgca-edhhihdc:-adses ses;}.igiidcfdeac {ihgd9gdgca-ed" - + "hhihdc:-c7des ses;}.bdghadaag .igiidcfdeac {ihgd9gdgca-edhhihdc:-cdses ses;}.hchgihaa .igiidcfdeac {ihgd9gdgca-edhhihdc:-cbdes ses;}.igiidcfdaagaghia {ihgd9gdgca-edhhihdc:-9hdses ses;}.bdghadaag .igii" - + "dcfdaagaghia {ihgd9gdgca-edhhihdc:-9hbdes ses;}.hchgihaa .igiidcfdaagaghia {ihgd9gdgca-edhhihdc:-9gsses ses;}.igiidcfahaa {ihgd9gdgca-edhhihdc:-9g7des ses;}.bdghadaag .igiidcfahaa {ihgd9gdgca-edhhihdc" - + ":-9gdses ses;}.hchgihaa .igiidcfahaa {ihgd9gdgca-edhhihdc:-9gbdes ses;}.igiidcfih9 {ihgd9gdgca-edhhihdc:-9dbdes ses;}.bdghadaag .igiidcfih9 {ihgd9gdgca-edhhihdc:-9asses ses;}.hchgihaa .igiidcfih9 {ihg" - + "d9gdgca-edhhihdc:-9a7des ses;}.igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9b7des ses;}.bdghadaag .igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9bdses ses;}.hchgihaa .igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9bbde" - + "s ses;}.igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9csses ses;}.bdghadaag .igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9c7des ses;}.hchgihaa .igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9cdses ses;}.igiidcfggahiaha" - + "ghah {ihgd9gdgca-edhhihdc:-9csses ses;}.bdghadaag .igiidcfggahiahaghah {ihgd9gdgca-edhhihdc:-9c7des ses;}.hchgihaa .igiidcfggahiahaghah {ihgd9gdgca-edhhihdc:-9cdses ses;}.igiidcfggahiagagdgaghia9dg9 {" - + "ihgd9gdgca-edhhihdc:-9cbdes ses;}.bdghadaag .igiidcfggahiagagdgaghia9dg9 {ihgd9gdgca-edhhihdc:-9dsses ses;}.hchgihaa .igiidcfggahiagagdgaghia9dg9 {ihgd9gdgca-edhhihdc:-9d7des ses;}.igiidcfggahiagagdga" - + "sdaaag {ihgd9gdgca-edhhihdc:-9ddses ses;}.bdghadaag .igiidcfggahiagagdgasdaaag {ihgd9gdgca-edhhihdc:-9dbdes ses;}.hchgihaa .igiidcfggahiagagdgasdaaag {ihgd9gdgca-edhhihdc:-7ssses ses;}.igiidcfggahiaga" - + "gdga {ihgd9gdgca-edhhihdc:-7s7des ses;}.bdghadaag .igiidcfggahiagagdga {ihgd9gdgca-edhhihdc:-7sdses ses;}.hchgihaa .igiidcfggahiagagdga {ihgd9gdgca-edhhihdc:-7sbdes ses;}.igiidcfggahiae79hhghagagdga {" - + "ihgd9gdgca-edhhihdc:-79bdes ses;}.bdghadaag .igiidcfggahiae79hhghagagdga {ihgd9gdgca-edhhihdc:-77sses ses;}.hchgihaa .igiidcfggahiae79hhghagagdga {ihgd9gdgca-edhhihdc:-777des ses;}.igiidcfbhdagagdga {" - + "ihgd9gdgca-edhhihdc:-77dses ses;}.bdghadaag .igiidcfbhdagagdga {ihgd9gdgca-edhhihdc:-77bdes ses;}.hchgihaa .igiidcfbhdagagdga {ihgd9gdgca-edhhihdc:-7hsses ses;}.igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-" - + "edhhihdc:-79sses ses;}.bdghadaag .igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-edhhihdc:-797des ses;}.hchgihaa .igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-edhhihdc:-79dses ses;}.igiidcfgaea9abhha {ihgd9gdgca-ed" - + "hhihdc:-7h7des ses;}.bdghadaag .igiidcfgaea9abhha {ihgd9gdgca-edhhihdc:-7hdses ses;}.hchgihaa .igiidcfgaea9abhha {ihgd9gdgca-edhhihdc:-7hbdes ses;}.igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9b7des ses" - + ";}.bdghadaag .igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9bdses ses;}.hchgihaa .igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9bbdes ses;}.igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7d7des ses;}.bdghadaag ." - + "igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7ddses ses;}.hchgihaa .igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7dbdes ses;}.igiidcfhhaa {ihgd9gdgca-edhhihdc:-7a7des ses;}.bdghadaag .igiidcfhhaa {ihgd9gdgc" - + "a-edhhihdc:-7adses ses;}.hchgihaa .igiidcfhhaa {ihgd9gdgca-edhhihdc:-7abdes ses;}.igiidcfhhaa {ihgd9gdgca-edhhihdc:-7a7des ses;}.bdghadaag .igiidcfhhaa {ihgd9gdgca-edhhihdc:-7adses ses;}.hchgihaa .igi" - + "idcfhhaa {ihgd9gdgca-edhhihdc:-7abdes ses;}.igiidcfaahi {ihgd9gdgca-edhhihdc:-h9shes ses;}.bdghadaag .igiidcfaahi {ihgd9gdgca-edhhihdc:-h97ces ses;}.hchgihaa .igiidcfaahi {ihgd9gdgca-edhhihdc:-h9dhes " - + "ses;}.igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h9bces ses;}.bdghadaag .igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h7shes ses;}.hchgihaa .igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h77ces ses;}.igiidcfcaagdcihgi {ihgd" - + "9gdgca-edhhihdc:-h7dhes ses;}.bdghadaag .igiidcfcaagdcihgi {ihgd9gdgca-edhhihdc:-h7bces ses;}.hchgihaa .igiidcfcaagdcihgi {ihgd9gdgca-edhhihdc:-hhshes ses;}.igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hh7ce" - + "s ses;}.bdghadaag .igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hhdhes ses;}.hchgihaa .igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hhbces ses;}.igiidcf7aae {ihgd9gdgca-edhhihdc:-hgshes ses;}.bdghadaag .igiidcf7aae" - + " {ihgd9gdgca-edhhihdc:-hg7ces ses;}.igiidcfagdebacg {ihgd9gdgca-edhhihdc:-hscces ses;ahai7:9ges;}.bdghadaag .igiidcfagdebacg {ihgd9gdgca-edhhihdc:-hsbges ses;}.hchgihaa .igiidcfagdebacg {ihgd9gdgca-ed" - + "hhihdc:-hscces ses;}.igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7bbdes ses;}.bdghadaag .igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7csses ses;}.hchgihaa .igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7c7des ses;}" - + ".igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hgdhes ses;}.bdghadaag .igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hgbces ses;}.hchgihaa .igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hdshes ses;}.igiidcfgas" - + "gah7 {ihgd9gdgca-edhhihdc:-hd7ces ses;}.bdghadaag .igiidcfgasgah7 {ihgd9gdgca-edhhihdc:-hddhes ses;}.hchgihaa .igiidcfgasgah7 {ihgd9gdgca-edhhihdc:-hdbces ses;}.igiidcfgadhaagdeids {ihgd9gdgca-edhhihd" - + "c:-hashes ses;}.bdghadaag .igiidcfgadhaagdeids {ihgd9gdgca-edhhihdc:-ha7ces ses;}.hchgihaa .igiidcfgadhaagdeids {ihgd9gdgca-edhhihdc:-hadhes ses;}.igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-habces ses;}" - + ".bdghadaag .igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-hbshes ses;}.hchgihaa .igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-hb7ces ses;}.igiidcfcaaagdeids {ihgd9gdgca-edhhihdc:-hbdges ses;}.bdghadaag .igiidc" - + "fcaaagdeids {ihgd9gdgca-edhhihdc:-hbbdes ses;}.hchgihaa .igiidcfcaaagdeids {ihgd9gdgca-edhhihdc:-hcsges ses;}.igiidcfighh7gahidga {ihgd9gdgca-edhhihdc:-hc7des ses;}.bdghadaag .igiidcfighh7gahidga {ihg" - + "d9gdgca-edhhihdc:-hcdges ses;}.hchgihaa .igiidcfighh7gahidga {ihgd9gdgca-edhhihdc:-hcbdes ses;}.hgdchbh9ah {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdcfhbh9ah.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:77es;ahca-7a" - + "h97i:77es;bhg9hc-gh97i:ses;ahai7:7des;ihgd9gdgca-edhhihdc:ses ses;}.hgdcfidddbhgdggggaci {ihgd9gdgca-edhhihdc:-ses ses;}.hgdcfidddbhgdggggacif7daag {ihgd9gdgca-edhhihdc:-7des ses;}.hgdcfidddbhgdggggac" - + "ifhchgihaa {ihgd9gdgca-edhhihdc:-dses ses;}.hgdcfasehca {ihgd9gdgca-edhhihdc:-bdes ses;}.hgdcfasehcaf7daag {ihgd9gdgca-edhhihdc:-9sses ses;}.hgdcfbhch9aggggaci {ihgd9gdgca-edhhihdc:-97des ses;}.hgdcfb" - + "hch9aggggacif7daag {ihgd9gdgca-edhhihdc:-9dses ses;}.hgdcfbhch9aggggacifhchgihaa {ihgd9gdgca-edhhihdc:-9bges ses;}.hgdcfgasgah7ggggaci {ihgd9gdgca-edhhihdc:-7sses ses;}.hgdcfgasgah7ggggacifhchgihaa {i" - + "hgd9gdgca-edhhihdc:-ah9es ses;}.hgdcfgasgah7ggggacif7daag {ihgd9gdgca-edhhihdc:-77des ses;}.hgdcfidddbhgdh {ahai7:7ses;ihgd9gdgca-edhhihdc:-7dses ses;}.hgdcfidddbhgdhf7daag {ahai7:7ses;ihgd9gdgca-edhh" - + "ihdc:-7bses ses;}.hgdcfge {ahai7:7ses;ihgd9gdgca-edhhihdc:-7cdes ses;}.hgdcfgef7daag {ahai7:7ses;ihgd9gdgca-edhhihdc:-hsdes ses;}.hgdcfgefhchgihaa {ahai7:7ses;ihgd9gdgca-edhhihdc:-h7des ses;}.hgdcfhah" - + "gg7 {ihgd9gdgca-edhhihdc:-hgdes ses;}.hgdcfhahgg7fhchgihaa {ihgd9gdgca-edhhihdc:-asaes ses;}.hgdcfhahgg7f7daag {ihgd9gdgca-edhhihdc:-hbges ses;}.hgdcfgdaaheha {ihgd9gdgca-edhhihdc:-gaaes ses;}.hgdcfgd" - + "aahehaf7daag {ihgd9gdgca-edhhihdc:-gd9es ses;}.hgdcfaggdg {ihgd9gdgca-edhhihdc:-g9hes ses;7ah97i:9ges;}.hgdcf7aae {ihgd9gdgca-edhhihdc:-gh9es ses;7ah97i:9ces;}.hgdcfhcsd {ihgd9gdgca-edhhihdc:-ggdes se" - + "s;7ah97i:9ges;}.hgdcfgddisdaaag {ihgd9gdgca-edhhihdc:-gades ses;7ah97i:7ses;}.hgdcfihgd {ihgd9gdgca-edhhihdc:-d9aes ses;ahai7 :7ses;}.hgdcfihgdf7daag {ihgd9gdgca-edhhihdc:-dhaes ses;ahai7 :7ses;}.hgdc" - + "fgadhafhahgg7 {ihgd9gdgca-edhhihdc:-ddaes ses;ahai7 :7des;}.hgdcfgadhafhahgg7f7daag {ihgd9gdgca-edhhihdc:-dc9es ses;ahai7:7des;}.gbhgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdchfaf.9hs);ihgd9gdgca-gaeahi:cd-" - + "gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa;ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.haghah {ihgd9gdgca-edhhihdc:-ses ses;}.gagfghia9dg9 {ihgd9gdgca-edhhihdc:-7ses ses;}.gagfsdaaag {ihgd" - + "9gdgca-edhhihdc:-gses ses;}.gagfsdaaagfhahhifsa {ihgd9gdgca-edhhihdc:-9gses ses;}.gagfsdaaagfahhedhaa {ihgd9gdgca-edhhihdc:-9ases ses;}.gagfsdaaagfsgd7ac {ihgd9gdgca-edhhihdc:-97ses ses;}.gagdgafe79hh" - + "gha {ihgd9gdgca-edhhihdc:-9sses ses;}.gagdgafabhha {ihgd9gdgca-edhhihdc:-cses ses;}.gagdga {ihgd9gdgca-edhhihdc:-ases ses;}.gagdgafhahhifsa {ihgd9gdgca-edhhihdc:-7sses ses;}.gagdgafahhedhaa {ihgd9gdgc" - + "a-edhhihdc:-77ses ses;}.gagdgafsgd7ac {ihgd9gdgca-edhhihdc:-9cses ses;}.gbhgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdchfaf.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa" - + ";ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.haghah {ihgd9gdgca-edhhihdc:-ses ses;}.gagfghia9dg9 {ihgd9gdgca-edhhihdc:-7ses ses;}.gagfsdaaag {ihgd9gdgca-edhhihdc:-gses ses;}.gagfsdaaagfhahhifsa {ihgd9gdg" - + "ca-edhhihdc:-9gses ses;}.gagfsdaaagfahhedhaa {ihgd9gdgca-edhhihdc:-9ases ses;}.gagfsdaaagfsgd7ac {ihgd9gdgca-edhhihdc:-97ses ses;}.gagdgafe79hhgha {ihgd9gdgca-edhhihdc:-9sses ses;}.gagdgafabhha {ihgd9" - + "gdgca-edhhihdc:-cses ses;}.gagdga {ihgd9gdgca-edhhihdc:-ases ses;}.gagdgafhahhifsa {ihgd9gdgca-edhhihdc:-7sses ses;}.gagdgafahhedhaa {ihgd9gdgca-edhhihdc:-77ses ses;}.gagdgafsgd7ac {ihgd9gdgca-edhhihd" - + "c:-9cses ses;}.shaahgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/gdcghiachihdc.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa;ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.shaa{ihg" - + "d9gdgca-edhhihdc:ses ses;}.shaafhggdihi{ihgd9gdgca-edhhihdc:-7ses ses;}.shaafheeaa{ihgd9gdgca-edhhihdc:-gses ses;}.shaafheeahghihdc{ihgd9gdgca-edhhihdc:-ases ses;}.shaafhgahd{ihgd9gdgca-edhhihdc:-cses" - + " ses;}.shaafasgaa{ihgd9gdgca-edhhihdc:-9sses ses;}.shaaf7iba{ihgd9gdgca-edhhihdc:-97ses ses;}.shaafhbh9a{ihgd9gdgca-edhhihdc:-9gses ses;}.shaafghah{ihgd9gdgca-edhhihdc:-9ases ses;}.shaafghahhgghei{ihg" - + "d9gdgca-edhhihdc:-9cses ses;}.shaafbhadga{ihgd9gdgca-edhhihdc:-7sses ses;}.shaafeei{ihgd9gdgca-edhhihdc:-77ses ses;}.shaafegdgagi{ihgd9gdgca-edhhihdc:-7gses ses;}.shaaffghgdihba{ihgd9gdgca-edhhihdc:-7" - + "ases ses;}.shaafiasi{ihgd9gdgca-edhhihdc:-7cses ses;}.shaafahaad{ihgd9gdgca-edhhihdc:-hsses ses;}.ahdh{ihgd9gdgca-edhhihdc:-hcses ses;}.shaafsba{ihgd9gdgca-edhhihdc:-h7ses ses;}.shaaf7he{ihgd9gdgca-ed" - + "hhihdc:-hgses ses;}.sdaaag{ihgd9gdgca-edhhihdc:-hases ses;}.shaafagdeids {ihgd9gdgca-edhhihdc:-gsses ses;}.aaaaiafhbhaa{ihgd9gdgca-edhhihdc:-ggses ses;ggghdg:edhciag;}.egiahgfh7hga{ihgd9gdgca-edhhihdc" - + ":-gases ses;}.h7hga{ihgd9gdgca-edhhihdc:-gcses ses;}.eghahia{ihgd9gdgca-edhhihdc:-dsses ses;}.gddisdaaag{ihgd9gdgca-edhhihdc:-dcses ses;}.adacfhggda{ihgd9gdgca-edhhihdc:-a77es ses;ahai7:9ces;}.7aae{ih" - + "gd9gdgca-edhhihdc:-agses ses;}.ighh7 {ihgd9gdgca-edhhihdc:-acses ses;}.hggdafgh97i {ihgd9gdgca-edhhihdc:-bs7es ses;ahai7:9ces;}.igahagggbih {a7hia-hehga:cdaghe;}.igahagggbih .igahagggbihfgddi {aagihgh" - + "a-hah9c:bhaaaa;ehaahc9:s;}.igahagggbih .igahagggbihfhggda {aagihgha-hah9c:bhaaaa;ehaahc9-aasi:7es;}.igahagggbih .igahagggbihfahgchba {aagihgha-hah9c:bhaaaa;ehaahc9-aasi:7es;sdci-shbha9:aghha,aaaaaihgh" - + ",hhch-haghs;sdci-hh7a:9ab;}.igahagggbih .igahagggbihfahgchba hcegi {ihgd9gdgca:ighchehgaci;idgaag:cdca;ehaahc9:ses;bhg9hc:ses;ahai7:9ss%;}a {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;}a:ahcd {iasi" - + "-aagdghihdc:cdca;gdadg:#ssssss;}a:ahhhiaa {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:hgihaa {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:ahcd.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:ahhhiaa.i" - + "ddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:hgihaa.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:7daag.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ggbggg;ggghdg:edhc" - + "iag;}a:ahcd.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-hh7a:dd%;}a:ahhhiaa.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-hh7a:dd%;}a:hgihaa.aaaaa9fiasi {iasi-aagdghihdc:gcaagahca;gdad" - + "g:#ssssss;sdci-hh7a:dd%;}a:7daag.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#ggbggg;sdci-hh7a:dd%;ggghdg:edhciag;}a:ahcd.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-aah97i:idaa;sdci-hh" - + "7a:dd%;}a:ahhhiaa.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-aah97i:idaa;sdci-hh7a:dd%;}a:hgihaa.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;sdci-aah97i:idaa;sdc" - + "i-hh7a:dd%;}a:7daag.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#ggbggg;sdci-hh7a:dd%;sdci-aah97i:idaa;ggghdg:edhciag;}a:ahcd.aaaaa7fiasi {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;}a:ahhhiaa.aaaaa7fia" - + "si {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;}a:hgihaa.aaaaa7fiasi {iasi-aagdghihdc:gcaagahca;gdadg:#cdcdcd;}a:7daag.aaaaa7fiasi {iasi-aagdghihdc:gcaagahca;gdadg:#ggbggg;ggghdg:edhciag;}a:ahcd.aaaaahfiasi {" - + "iasi-aagdghihdc:cdca;gdadg:#cdcdcd;ahca-7ah97i:7ses;}a:ahhhiaa.aaaaahfiasi {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;ahca-7ah97i:7ses;}a:hgihaa.aaaaahfiasi {iasi-aagdghihdc:gcaagahca;gdadg:#cdcdcd;ahca-7ah9" - + "7i:7ses;}a:7daag.aaaaahfiasi {iasi-aagdghihdc:cdca;gdadg:#ggbggg;ggghdg:edhciag;ahca-7ah97i:7ses;}a:ahcd.gcaagahca {gdadg:#ssssss;iasi-aagdghihdc:gcaagahca;ggghdg:edhciag;}a:ahhhiaa.gcaagahca {gdadg:#" - + "ssssss;iasi-aagdghihdc:gcaagahca;}a:hgihaa.gcaagahca {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;}a:7daag.gcaagahca {iasi-aagdghihdc:gcaagahca;gdadg:#ggbggg;}.igahagggbih hcegi {ggghdg:edhciag;}.igahaggg" - + "bih hcegi:7daag.hchgihaa {ggghdg:aashgai;gdadg:#adadad;}a:7daag,a.sdggh,a:ahcd.sdggh,a:ahhhiaa.sdggh,a:7daag.sdggh,a:hgihaa.sdggh,.ihiehhi igiidc:7daag,.igahagggbih hcegi:7daag {iasi-aagdghihdc:cdca;g" - + "dadg:#ggbggg;ggghdg:edhciag;}h hb9 {idgaag:cdca;}ida9 {ehaahc9-gh97i:ses;ehaahc9-aasi:ses;ehaahc9-idiidb:ses;ehaahc9-ide:ses;bhg9hc-gh97i:ses;bhg9hc-aasi:ses;bhg9hc-ide:ses;bhg9hc-idiidb:ses;ihgd9gdgc" - + "a-gdadg:#gggggg;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:bg%;}ihiaa {sdci-hh7a:9ab;}ihiaa ihiaa {sdci-hh7a:9ss%;}.aasigadhi {sadhi:aasi;}i {sdci-aah97i:idaa;}.igiidc {sdci-shbha9:sh7d" - + "bh,aghha,aaaaaihgh,hhch-haghs;ehaahc9:des;iasi-hah9c:gaciag;sadhi:aasi;}.ihhhgsgiidc {ehaahc9:ses;bhg9hc:ses;idgaag-hi9aa:cdca;ihgd9gdgca-gdadg:ighchehgaci;ggghdg:edhciag;}.ihhhgsgiidc .igiidcfiasi {a" - + "hca-7ah97i:7ses;sdci-hh7a:9ab;}.ihhhgsgiidc.bdghadaag .igiidcfiasi {gdadg:#ggbggg;}.ihhhgsgiidc.hchgihaa .igiidcfiasi {gdadg:#sgsgsg;ggghdg:aashgai;}.aasifigiidc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hh" - + "ch-haghs;sdci-hh7a:s.dab;ehaahc9-ide:des;ehaahc9-aasi:des;ehaahc9-gh97i:des;iasi-hah9c:gaciag;sadhi:aasi;bhc-ahai7:dses;}.gh97ifigiidc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;eh" - + "aahc9:des;iasi-hah9c:gaciag;sadhi:gh97i;}.gdagbcf7ahaag {sdci-aah97i:idaa;sdci-hh7a:dd%;ahca-7ah97i:9des;gdadg:#ssssss;ehaahc9-ide:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:7es;a7hia-hehga:cdaghe;iasi-hah9c:" - + "aasi;}.hgdcfgdagbcf7ahaag {ehaahc9-aasi:7des;}.ahihfgda i7 {iasi-hah9c:aasi;sdci-aah97i:cdgbha;}.ahihfgda .cd7hih {iasi-hah9c:gaciag;}#idddbhgdfihiaa i7 h {ehaahc9-aasi:9ses;}.ahihfgda {7ah97i:7des;ih" - + "gd9gdgca-gdadg:#gggggg;}.ahihfahhi9dagbc {ehaahc9-aasi:des;ehaahc9-gh97i:des;ahca-7ah97i:7des;}.agdeadac {idgaag-idiidb:9es iahgd;idgaag-gh97i:9es iahgd;idgaag-aasi:9es #9s9s9s;idgaag-ide:9es #9s9s" - + "9s;ahhhihahi9:7haaac;edhhihdc:hihdagia;ahai7:7sses;7-hcaas:9;ehaahc9:ses;ggghdg:edhciag;}.haaagi {ihgd9gdgca-gdadg:#g9gdga;sadhi:aasi;}haaagi.gghiaghh {sdci-hh7a:s.dab;ahai7:9cses;}.hbhaa {sdci-hh7a:d" - + "d%;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;}.ihiaaaehgag {ahai7:7ses;}.iasihcegi {ehaahc9:des;bhg9hc:ses;aagihgha-hah9c:ide;}i7 {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-aah97i:idaa;" - + "sdci-hh7a:dd%;}.ihiaa {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;sdci-aah97i:idaa;}.ahaga {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.aaaaafiddaihg {gaahg:idi7;a" - + "hai7:hgid;7ah97i:gces;ihgd9gdgca-gdadg:#d77ahc;}.iddaihgfaasi {sadhi:aasi;ahai7:hgid;iasi-hah9c:gaciag;}.iddaihgfgh97i {sadhi:gh97i;ahai7:hgid;iasi-hah9c:gaciag;}aha.iddaihg {sadhi:aasi;}.iddaihgfid9f" - + "aasi {sadhi:aasi;}.iddaihgfid9 {gdadg:#ssssss;sadhi:aasi;}.iddaihgfid9fgh97i {sadhi:aasi;}.iddaihgfigiidc {sadhi:aasi;iasi-hah9c:gaciag;ggghdg:edhciag;ehaahc9:ces ses ces ses;bhg9hc:ses;idgaag:ses cdc" - + "a;ihgd9gdgca-gdadg:ighchehgaci;}.iddaihgfigiidc.hchgihaa {ggghdg:hgid;}.iddaihgfigiidcfhgdc {gaahg:gh97i;sadhi:cdca;bhg9hc-aasi:hgid;bhg9hc-gh97i:hgid;idgaag:ses;}.iddaihgfigiidc .igiidcfiasi,.iddaihg" - + "figiidc hehc {ahheah9:iadgd;sdci-hh7a:s.cab;ehaahc9-aasi:des;ehaahc9-gh97i:des;sdci-shbha9:aghha,aaaaaihgh,hhch-haghs;ahca-7ah97i:s.cab;iasi-aagdghihdc:cdca;}.iddaihgfigiidc.bdghadaag .igiidcfiasi {gd" - + "adg:#ggbggg;}.iddaihgfigiidc.hchgihaa .igiidcfiasi {gdadg:9gh9;}.iicfahih9dcigdafaasi {sadhi:aasi;ehaahc9-aasi:des;}.cdaghe,.cdaghe ia,.iaehiaa {a7hia-hehga:cdaghe;}ihiaa.cdaghe,ihiaa.cdaghe ig,ia.ag" - + "he {a7hia-hehga:cdgbha;}.ihifhbhaafaasi {sadhi:aasi;}.ihifhbhaafgh97i {sadhi:aasi;}.ihifhbhaafid9 {sadhi:aasi;sdci-hh7a:dd%;}.ihifhbhaafid9 h {ahca-7ah97i:7ses;ehaahc9-ide:7es;}.ihifhbhaafdssfaasi {" - + "sadhi:aasi;ahai7:7ses;ehaahc9-ide:7es;}.ihifhbhaafdssfgh97i {sadhi:aasi;ehaahc9-ide:7es;}.ihifhbhaafdssfid9 {sadhi:aasi;sdci-hh7a:dd%;ehaahc9-ide:7es;}aha.ihifhbhaa {idgaag-aasi:9es hdaha #7a77hh;id" - + "gaag-gh97i:9es hdaha #7a77hh;idgaag-idiidb:9es hdaha #7a77hh;}aha.aaaaa9 {ahai7:hgid;gaahg:idi7;}aha.aaaaa9faasi {sadhi:aasi;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:7es;7ah97i:9ges;}aha.aaaaa" - + "9fgh97i {sadhi:gh97i;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:7es;7ah97i:9ges;}.aaaaa9fiasi {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#gggggg;sdci-hh7a:dd%;ehaahc9-aasi:7es;ehaahc9-g" - + "h97i:7es;}.aaaaa9fad9hc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#gggggg;sdci-hh7a:dd%;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-gh97i:des;}.aaaaa9fad9dgi {bhg9hc-gh97i:7es;}aha.ad9d {sad" - + "hi:aasi;}.aaaaa7fiasi {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#i7i7i7;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-gh97i:des;ahca-7ah97i:hhes;}.aaaaafadghihdc {gaahg:idi7;ahai7:hgid;7ah97i:7" - + "ces;ihgd9gdgca-gdadg:#d77ahc;edhhihdc:gaahihaa;}.adghihdcfaasi {bhg9hc-aasi:hes;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.aaaaafigahagggbi {gaahg:idi7;ahai7:hgid;7ah97i:7ces;ihgd9g" - + "dgca-gdadg:#d77ahc;}.igahagggbifaasi {ahai7:hgid;bhg9hc-gh97i:7dses;}.igahagggbifgh97i {sadhi:gh97i;ahai7:hgid;ahai7:7gces;}.igahagggbifigiidc {sadhi:aasi;bhg9hc-aasi:ses;bhg9hc-gh97i:ses;bhg9hc-ide:9" - + "es;ggghdg:edhciag;7ah97i:7ces;ihgd9gdgca-gdadg:ighchehgaci;idgaag:cdca;ehaahc9:ses;}.igahagggbifhbh9a {bhg9hc-aasi:hes;bhg9hc-gh97i:hes;bhg9hc-ide:9es;ggghdg:edhciag;7ah97i:7ces;idgaag:cdca;}.igahaggg" - + "bifehi7fgdcihhcag {ihgd9gdgca-gdadg:a7hia;ahai7:hgid;ehaahc9-ide:ses;ehaahc9-idiidb:ses;}.igahagggbihcah {ahai7:bes;7ah97i:7ces;ihgd9gdgca-gdadg:#d77ahc;}.igahagggbifehi7figiidc {sadhi:aasi;bhg9hc-gh9" - + "7i:9es;bhg9hc-ide:9es;bhg9hc-aasi:ses;}.cdsdgaag {idgaag:cdca;}.igahagggbifehi7fahcd {idgaag:cdca;}.igahagggbifehi7 {sadhi:aasi;}.igahagggbifehi7faasi,.igahagggbifehi7fgh97i {sdci-shbha9:sh7dbh,aghha," - + "aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.igahagggbifehi7fiasi {iasi-aagdghihdc:cdca;gdadg:#ssssss;sdci-hh7a:s.dab;ahca-7ah97i:7ges;bhg9hc-aasi:hes;}.hahgg7fehi7fgdcihhcag7 {sadhi:gh97i;ihgd9gdgca-gdadg:a7" - + "hia;gdadg:9gh9;ehaahc9-ide:ses;ehaahc9-idiidb:ses;7ah97i:7ges;idgaag:7es hdaha #d77ahc;}.hahgg7fhcegi7 {sadhi:aasi;ahai7:9gces;aagihgha-hah9c:bhaaaa;bhg9hc-aasi:9es;idgaag:7es hdaha a7hia;ihgd9gdgca-g" - + "dadg:a7hia;}#hahgg7iasi {sdci-shbha9:sh7dbh,dacaah,hhch-haghs;sdci-hh7a:9ab;}#hahgg7sddaihg {sdci-hh7a:9ab;}.hahgg7fehi7figiidc {sadhi:aasi;bhg9hc-aasi:ses;bhg9hc-ide:9es;bhg9hc-gh97i:9es;ggghdg:edhci" - + "ag;idgaag:cdca;}.ahgagidg9fehi7 {sadhi:aasi;}aha.ehi7faasi,aha.ehi7fgh97i {sadhi:aasi;sdci-aah97i:cdgbha;bhg9hc:ses;ahca-7ah97i:7des;ihgd9gdgca-gdadg:#d77ahc;}aha.ggggacifehi7figiidch {ihgd9gdgca-gd" - + "adg:#d77ahc;sadhi:aasi;}aha.idddbhgdh {sadhi:aasi;ihgd9gdgca-gdadg:#d77ahc;7ah97i:7des;ahca-7ah97i:7des;}ga.idddbhgd {ihgd9gdgca-gdadg:#gsg9g9;}ah.idddbhgd {ahhi-hi9aa:cdca;ehaahc9-aasi:des;ehaahc9-id" - + "e:7es;ehaahc9-idiidb:ses;ehaahc9-gh97i:des;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;}ah.bhch9afidddbhgdh {ahhi-hi9aa:cdca;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:ses;ehaah" - + "c9-gh97i:des;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;idgaag-ide:9es hdaha #7d7d7d;sdci-hh7a:s.dab;}aha.hahgg7 {sadhi:aasi;ahai7:hgid;ihgd9gdgca-gdadg:#d77ahc;}aha.9dd9aafhahgg7 {sadhi:gh97i;ihg" - + "d9gdgca-gdadg:#d77ahc;}aha.hahgg7fids {sdci-aah97i:cdgbha;bhg9hc:ses;ahca-7ah97i:7des;sadhi:aasi;ihgd9gdgca-gdadg:#d77ahc;}.bacg {idgaag-idiidb:9es hdaha #cscscs;idgaag-gh97i:9es hdaha #cscscs;idgaag" - + "-ide:9es hdaha #gggggg;idgaag-aasi:9es hdaha #gggggg;ihgd9gdgca-gdadg:#gggggg;sdci-shbha9:aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;ehaahc9:ses;}aha.shaafbhch9ag {ehaahc9:ses;ihgd9gdgca-gdadg:#s7sca" - + "7;idgaag:9es hdaha #sgsgsg;ahai7:9ss%;sadhi:aasi;}aha.sddiag {ahai7:hgid;sadhi:gh97i;ehaahc9-ide:7es;ehaahc9-idiidb:ses;}aha.bahhh9a {sadhi:aasi;sdci-aah97i:cdgbha;sdci-hh7a:dd%;gdadg:iahgd;bhg9hc:se" - + "s;ahca-7ah97i:77es;ahai7:hgid;ehaahc9:7es;}.gh97ifgahgd {idgaag:9es hdaha #9s9s9s;ihgd9gdgca-gdadg:#gsgggg;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;ahhhihahi9:7haaac;edhhihdc:hihd" - + "agia;ahai7:97ses;7-hcaas:9;ehaahc9:9ses;ggghdg:edhciag;}aha.ehgdehhi {ihgd9gdgca-gdadg:#gggggg;idgaag:9es hdaha #b99h7h;ehaahc9:des;}aha.ehgdehhiagah {gaahg:idi7;ehaahc9:9ses;}.bhch9afeh9a {ihgd9gdgca" - + "-gdadg:#ghghgh;}.gdbbaci {edhhihdc:gaahihaa;bhg9hc-ide:7es;ehaahc9:9ses;gaahg:gh97i;}.aaac9dbbaci {ihgd9gdgca:#gggggg;}.daa9dbbaci {ihgd9gdgca-gdadg:#ghghgh;idgaag-ide:#sgsgsg;idgaag-idiidb:#sgsgsg;}." - + "haa9dbbaciagah {bhg9hc-idiidb:des;}.gdbbaciagi7dg {sdci-hh7a:9ab;sdci-aah97i:idaa;ehaahc9-idiidb:des;}.gdbbacisasi {sdci-hh7a:dd%;ehaahc9-idiidb:9es;}.gdbbacishbahihbe {sdci-hh7a:s.cab;}.gdbbaci7aaaia" - + "97agdids {edhhihdc:hihdagia;gh97i:9ses;ide:9ses;ggghdg:edhciag;}aha.eh9afihiaa {gaahg:idi7;ahai7:hgid;}aha.hhaafchah9hihdc {bhg9hc-ide:ses;}ia.hhaafchah9hihdc {ihgd9gdgca-hbh9a:gga(hi9aah/hhaafchafid" - + "9.ge9);ihgd9gdgca-gaeahi:gaeahi-s;ahai7:9bdes;idgaag-gh97i:9es hdaha #sgsgsg;}.ihiehhi {bhg9hc-aasi:7ses;bhg9hc-ide:7ses;bhg9hc-idiidb:7ses;ehaahc9-aasi:9bes;}.ihiehhi igiidc {ihgd9gdgca-gdadg:ighcheh" - + "gaci;idgaag:ses cdca;bhg9hc:ses;ehaahc9:ses;ggghdg:edhciag;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;iasi-hah9c:aasi;}.ihiehhi ah {ehaahc9-aasi:ses;ehaahc9-ide:ses;ehaahc9-gh97i:ses;" - + "ehaahc9-idiidb:ges;ahhi-hi9aa-i9ea:cdca;sdci-hh7a:s.dab;}.aaihfhiabfhgihaa {ahhi-hi9aa-hbh9a:gga(hbh9ah/haaagiaafhgihdc.9hs);}.aaihfhiabfhgihaa igiidc {sdci-aah97i:idaa;}aha.gh97ifeh9afgdciaci {ahai7" - + ":hgid;ihgd9gdgca-gdadg:a7hia;}aha.hbhaafhgifiddaihg {ihgd9gdgca-gdadg:#9s9s9s;7ah97i:7des;ehaahc9-idiidb:des;}aha.hgifigiidc {sdci-hh7a:s.dab;ehaahc9-aasi:7es;ehaahc9-gh97i:7es;sadhi:aasi;iasi-hah9c:" - + "gaciag;}aha.eh9afihiaa {bhg9hc:ses;}.eh9afihiaa hcegi,.eh9afihiaa hgibhi,.eh9afihiaa haaagi,.eh9afihiaa iasihgah,.sdgbfgdciaci iasihgah {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}a" - + "ha.eh9afahih {bhg9hc:9ses;sadhi:aasi;}aha.bdahafsdgb {idgaag:9es hdaha #a9a9a9;bhc-ahai7:gases;}aha.sdgbfgdciaci {bhg9hc:7as;gaahg:idi7;ahai7:hgid;}.sdgbfgdciaci h {sdci-hh7a:9ab;}aha.sdgbfihiaafihg" - + " {idgaag-aasi:9es hdaha #b99h7h;idgaag-gh97i:9es hdaha #b99h7h;gaahg:idi7;}.sdgbfihiaafiasi {ahca-7ah97i:7aes;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;sdci-aah97i:idaa;gdadg:#hhhh" - + "hh;sdci-aah97i:idaa;aagihgha-hah9c:ihhaahca;bhg9hc:ses;ehaahc9-aasi:des;}.iicfeh9a9dcigdafaasi {ehaahc9-ide:ges;sadhi:aasi;}.iicfeh9a9dcigdafgh97i {ehaahc9-ide:ges;sadhi:gh97i;}aha.sdgbfgdcigdah {gaa" - + "hg:idi7;}aha.ghahdfigiidch {ehaahc9:des;}.aaig9sdgaag {idgaag:9es hdaha gaa;}.aaig9 {idgaag:9es hdaha #iii;}.haahcgaafhahgg7 {ahai7:hgid;gaahg:idi7;bhg9hc:9ses;ihgd9gdgca-gdadg:#ac7ahs;edhhihdc:gaah" - + "ihaa;}aha.hahgg7fid9 {edhhihdc:gaahihaa;ihgd9gdgca-gdadg:#h9h9h9;idgaag-idiidb:7es hdaha #d9a9sb;}.hahgg7fgdcihhcag {ahai7:hgid;bhg9hc-aasi:7ses;ehaahc9-ide:9ses;}aha.hahgg7fgefaasifgdgcag {sadhi:aa" - + "si;}aha.hahgg7fgefgh97ifgdgcag {sadhi:gh97i;}.hahgg7fihiaa {sdci-hh7a:dd%;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-ide:des;}.hahgg7fgghiaghh {ehaahc9-aasi:9ses;ehaahc9-gh97i:ses;ehaahc9-ide:des;sdci-" - + "hh7a:dd%;ihgd9gdgca-gdadg:#gggggg;idgaag:9es hdaha #sgsgsg;}aha.hahgg7figiidcfgda {ehaahc9-ide:des;idgaag-ide:9es hdaha #sgsgsg;sadhi:aasi;ahai7:9ss%;}aha.hahgg7figiidcfgdcihhcag {sadhi:gh97i;}aha.hah" - + "gg7fhaa9ghiaghhfgda {idgaag-idiidb:9es hdaha #sgsgsg;sadhi:aasi;ahai7:9ss%;7ah97i:7des;}aha.hahgg7fgghiaghhfgdcihhcag {idgaag:7es hdaha #d9a9sb;ehaahc9:des;}.hgdcehiaafiasi {sadhi:aasi;bhg9hc:ses;7ah9" - + "7i:7des;ahca-7ah97i:7des;ehaahc9-gh97i:des;sdci-hh7a:dd%;sdci-aah97i:idaa;}aha.hgdc {ahai7:7des;7ah97i:7des;sadhi:aasi;}a:ahcd.hahgg79ghiaghhfiasi {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;sdci-hh7a" - + "{sadhi:aasi;ahhi-hi9aa:cdca;bhg9hc-ide:hes;}.7aae9dcihhcag {edhhihdc:hihdagia;ide:7es;gh97i:7es;bhg9hc:ses;ehaahc9:ses;idgaag:ses cdca;7-hcaas:g;ggghdg:edhciag;ahhhihahi9:hc7aghi;ihgd9gdgca-gdadg:ighc" - + "hehgaci;}.7aae9dcihhcagaihihg {bhg9hc:ses;ehaahc9:ses;ggghdg:edhciag;ahhhihahi9:hc7aghi;}.9gh-bdagaa .7aae9dcihhcag {gh97i:ges;}.9gh-ahhad9 .9gh-ehcaa .7aae9dcihhcag {gh97i:7ses;}.sdgb7hih {sdci-hh7a" - + ":9ab;}ihiaa.cdihs9shiaa {idgaag:ses;}ihiaa.cdihs9shiaa .aasi9dagbc {iasi-hah9c:gh97i;aagihgha-hah9c:ide;sdci-aah97i:idaa;}ihiaa.cdihs9shiaa .gh97i9dagbc {iasi-hah9c:aasi;}ihiaa.hgeagihiaa {bhg9hc:s s " - + "s 7es;}ihiaa.hgeagihiaa iida9 ig ia.geadhaf7ahaag {idgaag-ide:9es hdaha g9i(9g7,9g7,9g7);idgaag-gh97i:9es hdaha g9i(9g7,9g7,9g7);idgaag-idiidb:cdca;idgaag-aasi:9es hdaha g9i(9g7,9g7,9g7);ihgd9gdgca:g9" - + "i(77d,77d,77d);ehaahc9:s;sdci-hh7a:s;7ah97i:hses;}ihiaa.hgeagihiaa iida9 ig ia.geadhaf7ahaag ihiaa {sdci-aah97i:ass;sdci-hh7a:9ab;ihgd9gdgca:ighchehgaci;gdadg:iahgd;ahai7:9ss%;bhg9hc:s;}ihiaa.hgeagihi" - + "aa iida9 ig ia.gdcihhchfgeadha {bhg9hc:s;ehaahc9-aasi:s;}aha.geadha {bhg9hc:s;ehaahc9:s;daagsada:hgid;7ah97i:7hses;ahai7:asses;idgaag:9es hdaha g9i(9g7,9g7,9g7);ihgd9gdgca:a7hia;}aha.geadha ihiaa {7ah" - + "97i:9ss%;idgaag:cdca;}.geadha-daagaghia {}aha.geadha ihiaa iida9 ig {7ah97i:7des;}aha.geadha ihiaa iida9 ig#geadhafiahcdgda {7ah97i:hgid;}.geadhafsddiag {idgaag-ide:cdca;idgaag-gh97i:9es hdaha g9i(9g7" - + ",9g7,9g7);idgaag-idiidb:9es hdaha g9i(9g7,9g7,9g7);idgaag-aasi:9es hdaha g9i(9g7,9g7,9g7);7ah97i:hses;ihgd9gdgca:g9i(77d,77d,77d);}.iaehiaa {sdci-aah97i:idaa;}.ihiaaf7ahaag {sdci-aah97i:idaa;sdci-hh7a" - + ":9ab;gdadg:#ssssss;ahca-7ah97i:7hes;ahai7:9ss%;}.gh97ifihiaaf7ahaag {ahca-7ah97i:7hes;ahai7:hes;sdci-aah97i:idaa;gdadg:#ssssss;sdci-hh7a:9ab;}.aasifihiaaf7ahaag {ahca-7ah97i:7hes;ahai7:ges;sdci-aah97i" - + "{ihgd9gdgca-gdadg:#gggggg;ia77bgd-abdas:ses;ia77bgd-ehgs:ses;ia77bgd-shsshf:ses;ia77bgd-shi:hces;faadbg-abdas:des;faadbg-ehgs:des;faadbg-shi:hces;faadbg-shsshf:ses;ghgs-abah:9ss%;}.aabhcfhaiahiaa {" - + "sdci-hh7a:9ab;}#shaahgdgb {edhhihdc:hihdagia;ide:ses;aasi:ses;ahai7:ses;7ah97i:ses;}.aaaaafhgiihih {ihgd9gdgca-gdadg:#gggggg;7ah97i:7ses;}.gdagbcf7ahaagfadc9 {sdci-hh7a:dd%;7ah97i:hses;gdadg:#sssss" - + "s;}aha.ihifhaafeagbhhhhdch,aha.ihifihhhgfeagbhhhhdch {sadhi:aasi;ahai7:hgid;iasi-hah9c:gaciag;}aha.eagbhhhhdchbhhaehhi {bhg9hc:ses;ehaahc9-aasi:7ses;ehaahc9-ide:des;ehaahc9-idiidb:des;}aha.eagbhhhhdch" - + "bhhaehhi ga {bhg9hc:ses;ehaahc9:ses ses ses 9ses;}aha.hgdcehiaafiasi {sadhi:aasi;bhg9hc:ses;7ah97i:7des;ahca-7ah97i:7des;ehaahc9-gh97i:des;sdci-aah97i:idaa;}aha.hgdc {ahai7:7des;7ah97i:7des;sadhi:a" - + "asi;}a.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:ahhhiaa.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:7daag.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:hgihaa.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}.ahia" - + "{9heha:#ggssss;ghgs-hhbdas:idaa;}.gh97ifiddaihg {sadhi:gh97i;ehaahc9-gh97i:des;}aha.asfhahgg7fid9 {bhg9hc-aasi:hes;bhg9hc-gh97i:hes;bhg9hc-idiidb:9ses;idgaag-idiidb:7es hdaha #d9a9sb;}.asfhahgg7 {ah" - + "ai7:hgid;gaahg:idi7;7ah97i:9hses;ehaahc9-ide:ses;bhg9hc:ses;ihgd9gdgca-gdadg:#d77ahc;}aha.asfhahgg7faasiaca {sadhi:aasi;}aha.asfhahgg7fgh97iaca {sadhi:gh97i;}.ahih h {sdci-hh7a:9ab;}.asfhahgg7fgdcihh" - + "cag {sadhi:aasi;bhg9hc-ide:des;}ia.asfhahgg7fiasi {sdci-hh7a:s.dab;}.asfhahgg7fiasi hcegi {sdci-hh7a:s.dab;}.asfhahgg7fiasi haaagi {sdci-hh7a:s.dab;}ia.asfihiaaaehgag {ahai7:9ses;}.asfihiaa9aaa {ehaah" - + "c9-aasi:9ses;ehaahc9-gh97i:des;}aha.hgihdcfhiae {ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:des;ehaahc9-gh97i:9ses;bhg9hc-gh97i:9des;ihgd9gdgca-gdadg:a7hia;idgaag-idiidb:7es dgihai;idgaag-gh97i:7" - + "es dgihai;ahai7:dd%;}aha.aaghhhdcfhiae {ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:des;ehaahc9-gh97i:des;ihgd9gdgca-gdadg:a7hia;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.i7" - + "ac {ihgd9gdgca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.i7acfida9 {ehaahc9-ide:des;ehaahc9-idiidb:" - + "des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.aaha {ihgd9gdgca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;a" - + "hai7:dd%;}aha.aahafida9 {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.haafhiae {ehaahc9-ide:9ses;ehaahc9-idiidb:9ses;iasi-hah9c:gaciag;}aha.casifhiae {ihgd9gd" - + "gca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.hsfida9 {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aa" - + "si:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.ehghbaiagh {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.eh9afida9 {ehaahc9-ide:9ses;ehaahc9-aasi:9ses;}aha.h7dgifhgi" - + "hdcfchba {sdci-hh7a:9ss%;}aha.h7dgifaaghhhdcfchba {sdci-hh7a:9ss%;}.gahaagfcdihshghihdc {ahheah9:cdca;}.gahaaghaabaci {edhhihdc:hihdagia;ide:-9es;aasi:-9ses;7ah97i:9es;ahca-7ah97i:9es;idgaag:cdca;eh" - + "aahc9:ses;bhg9hc:ses;ahai7:9es;daagsada:7haaac;}ihiaa.dig i7 aha {edhhihdc:gaahihaa;ide:-9ses;7ah97i:9es;daagsada:7haaac;}.idaaehiaah ahiaa,.ahiaa {sdci-aah97i:idaa;sdci-hh7a:9ab;}shaaahai.ghahddgdge " - + "{ehaahc9:ses;idgaag:cdca;iasi-hah9c:aasi;}shaaahai.ghahddgdge aa9aca {ehaahc9:ses;}shaaahai.ghahddgdge aha {ehaahc9-aasi:7ses;ehaahc9-idiidb:des;}shaaahai.ghahddgdge ahiaa {ahheah9:iadgd;bhg9hc-aasi:9" - + "79.ihiaa,77.ihiaa {bhg9hc:ses;}.9gh-bdagaa,.ahdhfihi7haa9dciaci,.hahgg7fid9,.haahcgaafhahgg7 {7ddb:9;}.eghcghehaehhi {ahhi-hi9aa-i9ea:cdca;}.ihiehhi igiidc,.aaaaa7fbacg igiidc,.aaaaahfbacg igiidc,.ihh" - + "hgsgiidc,.iddaihgfigiidc,.igahagggbihfahgchba hcegi,.shaaa9hiabsgdahagsgaa hcegi {ahai7:hgid;daagsada:ahhhiaa;}.gbaiaeaahahc9h {ehaahc9-aasi:7ses;sdci-aah97i:idaa;sdci-hh7a:9ss%;}.9ghaids {ahai7:9ss%;" - + "sdci-shbha9:sh7dbh,dacaah,hhch-haghs;sdci-hh7a:9ss%;ehaahc9:ses;bhg9hc:ses;idgaag-idiidb:ses;idgaag-aasi:ses;idgaag-gh97i:ses;ihgd9gdgca-gdadg:#gshghg;daagsada:7haaac;}.digids hcegi {ggghdg:aashgai;}." - + "bgaihehhi {sadhi:aasi;ahheah9:hcahca;ehaahc9:s 7ses;bhg9hc:s;}.bgaihehhi .cd7hagah {ahhi-hi9aa:cdca;}.s9fgaciagidhhihdc {bhg9hc:ses hgid;}.ahdhfeh9a9dciaci {ihgd9gdgca-hbh9a:gga(hi9aah/ahdhfid9.ge9);i" - + "hgd9gdgca-gaeahi:gaeahi-9;}shca9haghaaaaagihdc,.asfhahgg7fid9,#aaaaa7,.aaaaa7fihifshaafaasi,.iddaihg,.iddaihgfid9,.aaaaa7fihih,.aaaaa7fbacg .ihifbha,.aaaaa7fihifshaafgh97i,aha.aaaaa7fhgihaa .ihifbha,." - + "ahdhfaaaaa9,.gdagbcf7ahaagfadc9,.ahdhfeh9ashiaa,.ahdhfeh9agddiag,.igahagggbifehi7fgdcihhcag,.ggggacifehi7figiidch,.hahgg7fids,#aaaaah,.aaaaahfchah9hihdc,.aaaaahfhgihaa .ihifbha,.ahdhfihi .ihisd9,.ahdh" - + "fihi .haaagiaa .ihisd9,.ahdhfihighaa,#aaaaa9,.aaaaa9,aha.9ghaids .s7ag,aha.9ghaids .sig,aha.9ghaids .sig ia,.gdagbcf7ahaag,.ihifhbhaafid9,.ihifhbhaafdssfid9,.eagbfihifhaaagiaa .ihifhbhaafid9,.ahdhfaaa" - + "aah {ihgd9gdgca-hbh9a:gga(heghiahfgfd.ec9);ihgd9gdgca-gaeahi:gaeahi-s;}shca9haghaaaaagihdc {ihgd9gdgca-edhhihdc:-ses -ses;7ah97i:9gces;}.asfhahgg7fid9 {ihgd9gdgca-edhhihdc:-ses -9gces;7ah97i:97ses;}#a" - + "aaaa7,.aaaaa7fihifshaafaasi {ihgd9gdgca-edhhihdc:-ses -7aces;7ah97i:gces;}.iddaihg,.iddaihgfid9 {ihgd9gdgca-edhhihdc:-ses -h9aes;7ah97i:gces;}a.aaaaa7fihih,.aaaaa7fbacg .ihifbha,.aaaaa7fihifshaafgh97i" - + " {ihgd9gdgca-edhhihdc:-ses -hages;7ah97i:hhes;}aha.aaaaa7fhgihaa .ihifbha {ihgd9gdgca-edhhihdc:-ses -hdbes;7ah97i:hhes;}.ahdhfaaaaa9 {ihgd9gdgca-edhhihdc:-ses -ghses;7ah97i:h7es;}.gdagbcf7ahaagfadc9 {" - + "ihgd9gdgca-edhhihdc:-ses -ga7es;7ah97i:hses;}.ahdhfeh9ashiaa {ihgd9gdgca-edhhihdc:-ses -gd7es;7ah97i:7des;}.hahgg7fgefgh97ifgdgcag {ihgd9gdgca-edhhihdc:-h9es -99ges;ahai7:9ses;7ah97i:ces;}.hahgg7fid9 " - + "{ihgd9gdgca-hbh9a:gga(hi9aah/haahcgaafehcaafid9.ge9);ihgd9gdgca-gaeahi:gaeahi-s;}.eh9afihiaa,aha.eh9afgdcigdah,aha.sdgbfgdcigdah,aha.9gh-ahhad9 aha.9gh-bdagaa aha.si,aha.gh97ifeh9afgdciaci aha.9gh-bda" - + "gaa aha.7a,aha.ggahiahh7hga9dciaciagah aha.9gh-bdagaa aha.si,aha.cdihs99dciaciagah aha.9gh-bdagaa aha.si,aha.agdesdshh7hga9dciaciagah aha.9gh-bdagaa aha.si,.sdgbfihiaafihg,aha.9gh-ahhad9 aha.9gh-bdaga" - + "a aha.7a,.hcaggaacfihiaashg,.ihiaaf7ahaag,.gh97ifihiaaf7ahaag,.aasifihiaaf7ahaag,.igiidcfid9,.hchgihaa .igiidcfid9 {ihgd9gdgca-hbh9a:gga(ihhaaeghiahfgfd.ec9);ihgd9gdgca-gaeahi:gaeahi-s;}.eh9afihiaa,ah" - + "a.eh9afgdcigdah,aha.sdgbfgdcigdah,aha.9gh-ahhad9 aha.9gh-bdagaa aha.si,aha.gh97ifeh9afgdciaci aha.9gh-bdagaa aha.7a,aha.ggahiahh7hga9dciaciagah aha.9gh-bdagaa aha.si,aha.cdihs99dciaciagah aha.9gh-bdag" - + "aa aha.si,aha.agdesdshh7hga9dciaciagah aha.9gh-bdagaa aha.si {ihgd9gdgca-edhhihdc:-ses -ses;7ah97i:7des;}.sdgbfihiaafihg,aha.9gh-ahhad9 aha.9gh-bdagaa aha.7a,.hcaggaacfihiaashg,.ihiaaf7ahaag,.gh97ifih" - + "iaaf7ahaag,.aasifihiaaf7ahaag {ihgd9gdgca-edhhihdc:-ses -7des;7ah97i:7aes;}.igiidcfid9 {edhhihdc:gaahihaa;bhg9hc-gh97i:7es;ehaahc9-gh97i:9hes;ehaahc9-aasi:9hes;bhg9hc-aasi:7es;a7hia-hehga:cdaghe;ihgd9" - + "gdgca-edhhihdc:-ses -ddes;7ah97i:77es;}.hchgihaa .igiidcfid9 {ihgd9gdgca-edhhihdc:-ses -bbes;7ah97i:77es;}.aashgaifad9d,.hchgihaa .igiidcfaasi,.igiidcfaasi,.igiidcfgh97i,.hchgihaa .igiidcfgh97i,.hgdcf" - + "hcsd,.hgdcfaggdg {ihgd9gdgca-hbh9a:gga(ihhaaeghiahfghgh.ec9);ihgd9gdgca-gaeahi:cd-gaeahi;}.aashgaifad9d {ihgd9gdgca-edhhihdc:-ses -ses;ahai7:c7es;7ah97i:hdes;}.hchgihaa .igiidcfaasi {ihgd9gdgca-edhhih" - + "dc:-c7es -ses;ahai7:9ges;7ah97i:77es;}.igiidcfaasi {edhhihdc:hihdagia;ide:ses;aasi:-7es;ihgd9gdgca-edhhihdc:-daes -ses;ahai7:9hes;7ah97i:77es;}.igiidcfgh97i {edhhihdc:hihdagia;ide:ses;gh97i:-7es;ihgd9" - + "gdgca-edhhihdc:-9sdes -ses;ahai7:9hes;7ah97i:77es;}.hchgihaa .igiidcfgh97i {ihgd9gdgca-edhhihdc:-977es -ses;ahai7:9hes;7ah97i:77es;}.hgdcfhcsd {ihgd9gdgca-edhhihdc:-c7es -77es;ahai7:9ges;7ah97i:9des;}" - + ".hgdcfaggdg {ihgd9gdgca-edhhihdc:-daes -77es;ahai7:9ges;7ah97i:9ges;}"; - - var largeNewValue = largeTest, - len = largeTest.length, - count = nextRandom() % 20, - removeBound = len-(count*100), - logData = []; - for (; count > 0; count--) { - var removePos = nextRandom() % removeBound; - var removeLength = 1+nextRandom()%100; - logData.push("(" + removePos + ", " + removeLength + ")"); - largeNewValue = largeNewValue.substring(0, removePos) - + largeNewValue.substring(removePos + removeLength); - } - log("len: " + len + " count: " + count + " removed ( " + logData.join(", ") + " )"); - - diffResult = diff.diffWords(largeTest, largeNewValue); - log("diffResult length: " + diffResult.length); - var removeCount = 0; - var removeChanges = [], addChanges = [], testChanges = []; - for (var i = 0; i < diffResult.length; i++) { - if (diffResult[i].removed) { - log("remove Change " + i, diffResult[i]); - removeChanges.push(diffResult[i].value); - } else if (diffResult[i].added) { - log("add Change " + i, diffResult[i]); - addChanges.push(diffResult[i].value); - } else { - log("no Change " + i, diffResult[i]); - removeChanges.push(diffResult[i].value); - addChanges.push(diffResult[i].value); - } - } - - log("diffResult remove length: " + removeCount); - assert.equal(largeTest.replace(/s+/g, ""), removeChanges.join("").replace(/s+/g, ""), "New Diff results match"); - assert.equal(largeNewValue.replace(/s+/g, ""), addChanges.join("").replace(/s+/g, ""), "Old Diff results match"); -}; - -exports['Patch'] = function() { - // Create patch - var oldFile = - "value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "remove value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "remove value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "value\n" - + "context\n" - + "context"; - var newFile = - "new value\n" - + "new value 2\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "add value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "new value\n" - + "new value 2\n" - + "context\n" - + "context"; - var expectedResult = - "Index: testFileName\n" - + "===================================================================\n" - + "--- testFileName\tOld Header\n" - + "+++ testFileName\tNew Header\n" - + "@@ -1,5 +1,6 @@\n" - + "+new value\n" - + "+new value 2\n" - + "-value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "@@ -7,9 +8,8 @@\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "-remove value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "@@ -17,20 +17,21 @@\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "-remove value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "+add value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "+new value\n" - + "+new value 2\n" - + "-value\n" - + " context\n" - + " context\n" - + "\\ No newline at end of file\n"; - - diffResult = diff.createPatch("testFileName", oldFile, newFile, "Old Header", "New Header"); - assert.equal( - expectedResult, - diffResult); - - expectedResult = - "Index: testFileName\n" - + "===================================================================\n" - + "--- testFileName\tOld Header\n" - + "+++ testFileName\tNew Header\n"; - diffResult = diff.createPatch("testFileName", oldFile, oldFile, "Old Header", "New Header"); - assert.equal( - expectedResult, - diffResult, - "Patch same diffResult Value"); -}; - -exports['convertToDMP'] = function() { - diffResult = diff.diffWords("New Value ", "New ValueMoreData "); - - assert.deepEqual( - [[0,'New '],[1,'ValueMoreData'],[-1,'Value'],[0,' ']], - diff.convertChangesToDMP(diffResult), - "DMP conversion of diffResult"); -}; diff --git a/node_modules/vows/node_modules/eyes/LICENSE b/node_modules/vows/node_modules/eyes/LICENSE deleted file mode 100644 index a1edd93..0000000 --- a/node_modules/vows/node_modules/eyes/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2009 cloudhead - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vows/node_modules/eyes/Makefile b/node_modules/vows/node_modules/eyes/Makefile deleted file mode 100644 index a121dea..0000000 --- a/node_modules/vows/node_modules/eyes/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -test: - @@node test/eyes-test.js - -.PHONY: test diff --git a/node_modules/vows/node_modules/eyes/README.md b/node_modules/vows/node_modules/eyes/README.md deleted file mode 100644 index c4f6f76..0000000 --- a/node_modules/vows/node_modules/eyes/README.md +++ /dev/null @@ -1,73 +0,0 @@ -eyes -==== - -a customizable value inspector for Node.js - -synopsis --------- - -I was tired of looking at cluttered output in the console -- something needed to be done, -`sys.inspect()` didn't display regexps correctly, and was too verbose, and I had an hour or two to spare. -So I decided to have some fun. _eyes_ were born. - -![eyes-ss](http://dl.dropbox.com/u/251849/eyes-js-ss.gif) - -_example of the output of a user-customized eyes.js inspector_ - -*eyes* also deals with circular objects in an intelligent way, and can pretty-print object literals. - -usage ------ - - var inspect = require('eyes').inspector({styles: {all: 'magenta'}}); - - inspect(something); // inspect with the settings passed to `inspector` - -or - - var eyes = require('eyes'); - - eyes.inspect(something); // inspect with the default settings - -you can pass a _label_ to `inspect()`, to keep track of your inspections: - - eyes.inspect(something, "a random value"); - -If you want to return the output of eyes without printing it, you can set it up this way: - - var inspect = require('eyes').inspector({ stream: null }); - - sys.puts(inspect({ something: 42 })); - -customization -------------- - -These are the default styles and settings used by _eyes_. - - styles: { // Styles applied to stdout - all: 'cyan', // Overall style applied to everything - label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]` - other: 'inverted', // Objects which don't have a literal representation, such as functions - key: 'bold', // The keys in object literals, like 'a' in `{a: 1}` - special: 'grey', // null, undefined... - string: 'green', - number: 'magenta', - bool: 'blue', // true false - regexp: 'green', // /\d+/ - }, - - pretty: true, // Indent object literals - hideFunctions: false, // Don't output functions at all - stream: process.stdout, // Stream to write to, or null - maxLength: 2048 // Truncate output if longer - -You can overwrite them with your own, by passing a similar object to `inspector()` or `inspect()`. - - var inspect = require('eyes').inspector({ - styles: { - all: 'magenta', - special: 'bold' - }, - maxLength: 512 - }); - diff --git a/node_modules/vows/node_modules/eyes/lib/eyes.js b/node_modules/vows/node_modules/eyes/lib/eyes.js deleted file mode 100644 index 10d964b..0000000 --- a/node_modules/vows/node_modules/eyes/lib/eyes.js +++ /dev/null @@ -1,236 +0,0 @@ -// -// Eyes.js - a customizable value inspector for Node.js -// -// usage: -// -// var inspect = require('eyes').inspector({styles: {all: 'magenta'}}); -// inspect(something); // inspect with the settings passed to `inspector` -// -// or -// -// var eyes = require('eyes'); -// eyes.inspect(something); // inspect with the default settings -// -var eyes = exports, - stack = []; - -eyes.defaults = { - styles: { // Styles applied to stdout - all: 'cyan', // Overall style applied to everything - label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]` - other: 'inverted', // Objects which don't have a literal representation, such as functions - key: 'bold', // The keys in object literals, like 'a' in `{a: 1}` - special: 'grey', // null, undefined... - string: 'green', - number: 'magenta', - bool: 'blue', // true false - regexp: 'green', // /\d+/ - }, - pretty: true, // Indent object literals - hideFunctions: false, - showHidden: false, - stream: process.stdout, - maxLength: 2048 // Truncate output if longer -}; - -// Return a curried inspect() function, with the `options` argument filled in. -eyes.inspector = function (options) { - var that = this; - return function (obj, label, opts) { - return that.inspect.call(that, obj, label, - merge(options || {}, opts || {})); - }; -}; - -// If we have a `stream` defined, use it to print a styled string, -// if not, we just return the stringified object. -eyes.inspect = function (obj, label, options) { - options = merge(this.defaults, options || {}); - - if (options.stream) { - return this.print(stringify(obj, options), label, options); - } else { - return stringify(obj, options) + (options.styles ? '\033[39m' : ''); - } -}; - -// Output using the 'stream', and an optional label -// Loop through `str`, and truncate it after `options.maxLength` has been reached. -// Because escape sequences are, at this point embeded within -// the output string, we can't measure the length of the string -// in a useful way, without separating what is an escape sequence, -// versus a printable character (`c`). So we resort to counting the -// length manually. -eyes.print = function (str, label, options) { - for (var c = 0, i = 0; i < str.length; i++) { - if (str.charAt(i) === '\033') { i += 4 } // `4` because '\033[25m'.length + 1 == 5 - else if (c === options.maxLength) { - str = str.slice(0, i - 1) + '…'; - break; - } else { c++ } - } - return options.stream.write.call(options.stream, (label ? - this.stylize(label, options.styles.label, options.styles) + ': ' : '') + - this.stylize(str, options.styles.all, options.styles) + '\033[0m' + "\n"); -}; - -// Apply a style to a string, eventually, -// I'd like this to support passing multiple -// styles. -eyes.stylize = function (str, style, styles) { - var codes = { - 'bold' : [1, 22], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'cyan' : [36, 39], - 'magenta' : [35, 39], - 'blue' : [34, 39], - 'yellow' : [33, 39], - 'green' : [32, 39], - 'red' : [31, 39], - 'grey' : [90, 39] - }, endCode; - - if (style && codes[style]) { - endCode = (codes[style][1] === 39 && styles.all) ? codes[styles.all][0] - : codes[style][1]; - return '\033[' + codes[style][0] + 'm' + str + - '\033[' + endCode + 'm'; - } else { return str } -}; - -// Convert any object to a string, ready for output. -// When an 'array' or an 'object' are encountered, they are -// passed to specialized functions, which can then recursively call -// stringify(). -function stringify(obj, options) { - var that = this, stylize = function (str, style) { - return eyes.stylize(str, options.styles[style], options.styles) - }, index, result; - - if ((index = stack.indexOf(obj)) !== -1) { - return stylize(new(Array)(stack.length - index + 1).join('.'), 'special'); - } - stack.push(obj); - - result = (function (obj) { - switch (typeOf(obj)) { - case "string" : obj = stringifyString(obj.indexOf("'") === -1 ? "'" + obj + "'" - : '"' + obj + '"'); - return stylize(obj, 'string'); - case "regexp" : return stylize('/' + obj.source + '/', 'regexp'); - case "number" : return stylize(obj + '', 'number'); - case "function" : return options.stream ? stylize("Function", 'other') : '[Function]'; - case "null" : return stylize("null", 'special'); - case "undefined": return stylize("undefined", 'special'); - case "boolean" : return stylize(obj + '', 'bool'); - case "date" : return stylize(obj.toUTCString()); - case "array" : return stringifyArray(obj, options, stack.length); - case "object" : return stringifyObject(obj, options, stack.length); - } - })(obj); - - stack.pop(); - return result; -}; - -// Escape invisible characters in a string -function stringifyString (str, options) { - return str.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/[\u0001-\u001F]/g, function (match) { - return '\\0' + match[0].charCodeAt(0).toString(8); - }); -} - -// Convert an array to a string, such as [1, 2, 3]. -// This function calls stringify() for each of the elements -// in the array. -function stringifyArray(ary, options, level) { - var out = []; - var pretty = options.pretty && (ary.length > 4 || ary.some(function (o) { - return (o !== null && typeof(o) === 'object' && Object.keys(o).length > 0) || - (Array.isArray(o) && o.length > 0); - })); - var ws = pretty ? '\n' + new(Array)(level * 4 + 1).join(' ') : ' '; - - for (var i = 0; i < ary.length; i++) { - out.push(stringify(ary[i], options)); - } - - if (out.length === 0) { - return '[]'; - } else { - return '[' + ws - + out.join(',' + (pretty ? ws : ' ')) - + (pretty ? ws.slice(0, -4) : ws) + - ']'; - } -}; - -// Convert an object to a string, such as {a: 1}. -// This function calls stringify() for each of its values, -// and does not output functions or prototype values. -function stringifyObject(obj, options, level) { - var out = []; - var pretty = options.pretty && (Object.keys(obj).length > 2 || - Object.keys(obj).some(function (k) { return typeof(obj[k]) === 'object' })); - var ws = pretty ? '\n' + new(Array)(level * 4 + 1).join(' ') : ' '; - - var keys = options.showHidden ? Object.keys(obj) : Object.getOwnPropertyNames(obj); - keys.forEach(function (k) { - if (Object.prototype.hasOwnProperty.call(obj, k) - && !(obj[k] instanceof Function && options.hideFunctions)) { - out.push(eyes.stylize(k, options.styles.key, options.styles) + ': ' + - stringify(obj[k], options)); - } - }); - - if (out.length === 0) { - return '{}'; - } else { - return "{" + ws - + out.join(',' + (pretty ? ws : ' ')) - + (pretty ? ws.slice(0, -4) : ws) + - "}"; - } -}; - -// A better `typeof` -function typeOf(value) { - var s = typeof(value), - types = [Object, Array, String, RegExp, Number, Function, Boolean, Date]; - - if (s === 'object' || s === 'function') { - if (value) { - types.forEach(function (t) { - if (value instanceof t) { s = t.name.toLowerCase() } - }); - } else { s = 'null' } - } - return s; -} - -function merge(/* variable args */) { - var objs = Array.prototype.slice.call(arguments); - var target = {}; - - objs.forEach(function (o) { - Object.keys(o).forEach(function (k) { - if (k === 'styles') { - if (! o.styles) { - target.styles = false; - } else { - target.styles = {} - for (var s in o.styles) { - target.styles[s] = o.styles[s]; - } - } - } else { - target[k] = o[k]; - } - }); - }); - return target; -} - diff --git a/node_modules/vows/node_modules/eyes/package.json b/node_modules/vows/node_modules/eyes/package.json deleted file mode 100644 index 0693505..0000000 --- a/node_modules/vows/node_modules/eyes/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "eyes", - "description": "a customizable value inspector", - "url": "http://github.com/cloudhead/eyes.js", - "keywords": [ - "inspector", - "debug", - "inspect", - "print" - ], - "author": { - "name": "Alexis Sellier", - "email": "self@cloudhead.net" - }, - "contributors": [ - { - "name": "Charlie Robbins", - "email": "charlie@nodejitsu.com" - } - ], - "licenses": [ - "MIT" - ], - "main": "./lib/eyes", - "version": "0.1.8", - "scripts": { - "test": "node test/*-test.js" - }, - "directories": { - "lib": "./lib", - "test": "./test" - }, - "engines": { - "node": "> 0.1.90" - }, - "readme": "eyes\n====\n\na customizable value inspector for Node.js\n\nsynopsis\n--------\n\nI was tired of looking at cluttered output in the console -- something needed to be done,\n`sys.inspect()` didn't display regexps correctly, and was too verbose, and I had an hour or two to spare. \nSo I decided to have some fun. _eyes_ were born.\n\n![eyes-ss](http://dl.dropbox.com/u/251849/eyes-js-ss.gif)\n\n_example of the output of a user-customized eyes.js inspector_\n\n*eyes* also deals with circular objects in an intelligent way, and can pretty-print object literals.\n\nusage\n-----\n\n var inspect = require('eyes').inspector({styles: {all: 'magenta'}});\n\n inspect(something); // inspect with the settings passed to `inspector`\n\nor\n\n var eyes = require('eyes');\n\n eyes.inspect(something); // inspect with the default settings\n\nyou can pass a _label_ to `inspect()`, to keep track of your inspections:\n\n eyes.inspect(something, \"a random value\");\n\nIf you want to return the output of eyes without printing it, you can set it up this way:\n\n var inspect = require('eyes').inspector({ stream: null });\n\n sys.puts(inspect({ something: 42 }));\n\ncustomization\n-------------\n\nThese are the default styles and settings used by _eyes_.\n\n styles: { // Styles applied to stdout\n all: 'cyan', // Overall style applied to everything\n label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]`\n other: 'inverted', // Objects which don't have a literal representation, such as functions\n key: 'bold', // The keys in object literals, like 'a' in `{a: 1}`\n special: 'grey', // null, undefined...\n string: 'green',\n number: 'magenta',\n bool: 'blue', // true false\n regexp: 'green', // /\\d+/\n },\n \n pretty: true, // Indent object literals\n hideFunctions: false, // Don't output functions at all\n stream: process.stdout, // Stream to write to, or null\n maxLength: 2048 // Truncate output if longer\n\nYou can overwrite them with your own, by passing a similar object to `inspector()` or `inspect()`.\n\n var inspect = require('eyes').inspector({\n styles: {\n all: 'magenta',\n special: 'bold'\n },\n maxLength: 512\n });\n\n", - "_id": "eyes@0.1.8", - "_from": "eyes@>=0.1.6" -} diff --git a/node_modules/vows/node_modules/eyes/test/eyes-test.js b/node_modules/vows/node_modules/eyes/test/eyes-test.js deleted file mode 100644 index 1f9606a..0000000 --- a/node_modules/vows/node_modules/eyes/test/eyes-test.js +++ /dev/null @@ -1,56 +0,0 @@ -var util = require('util'); -var eyes = require('../lib/eyes'); - -eyes.inspect({ - number: 42, - string: "John Galt", - regexp: /[a-z]+/, - array: [99, 168, 'x', {}], - func: function () {}, - bool: false, - nil: null, - undef: undefined, - object: {attr: []} -}, "native types"); - -eyes.inspect({ - number: new(Number)(42), - string: new(String)("John Galt"), - regexp: new(RegExp)(/[a-z]+/), - array: new(Array)(99, 168, 'x', {}), - bool: new(Boolean)(false), - object: new(Object)({attr: []}), - date: new(Date) -}, "wrapped types"); - -var obj = {}; -obj.that = { self: obj }; -obj.self = obj; - -eyes.inspect(obj, "circular object"); -eyes.inspect({hello: 'moto'}, "small object"); -eyes.inspect({hello: new(Array)(6) }, "big object"); -eyes.inspect(["hello 'world'", 'hello "world"'], "quotes"); -eyes.inspect({ - recommendations: [{ - id: 'a7a6576c2c822c8e2bd81a27e41437d8', - key: [ 'spree', 3.764316258020699 ], - value: { - _id: 'a7a6576c2c822c8e2bd81a27e41437d8', - _rev: '1-2e2d2f7fd858c4a5984bcf809d22ed98', - type: 'domain', - domain: 'spree', - weight: 3.764316258020699, - product_id: 30 - } - }] -}, 'complex'); - -eyes.inspect([null], "null in array"); - -var inspect = eyes.inspector({ stream: null }); - -util.puts(inspect('something', "something")); -util.puts(inspect("something else")); - -util.puts(inspect(["no color"], null, { styles: false })); diff --git a/node_modules/vows/package.json b/node_modules/vows/package.json deleted file mode 100644 index 0fdf835..0000000 --- a/node_modules/vows/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "vows", - "description": "Asynchronous BDD & continuous integration for node.js", - "url": "http://vowsjs.org", - "keywords": [ - "testing", - "spec", - "test", - "BDD" - ], - "author": { - "name": "Alexis Sellier", - "email": "self@cloudhead.net" - }, - "contributors": [ - { - "name": "Charlie Robbins", - "email": "charlie.robbins@gmail.com" - } - ], - "dependencies": { - "eyes": ">=0.1.6", - "diff": "~1.0.3" - }, - "main": "./lib/vows", - "bin": { - "vows": "./bin/vows" - }, - "directories": { - "test": "./test", - "bin": "./bin" - }, - "version": "0.6.4", - "scripts": { - "test": "node ./bin/vows --spec" - }, - "readme": "Vows\n====\n\n> Asynchronous BDD & continuous integration for node.js\n\n#### #\n\nintroduction\n------------\nThere are two reasons why we might want asynchronous testing. The first, and obvious reason is that node.js is asynchronous, and therefore our tests need to be. The second reason is to make test suites which target I/O libraries run much faster.\n\n_Vows_ is an experiment in making this possible, while adding a minimum of overhead.\n\nsynopsis\n--------\n\n var vows = require('vows'),\n assert = require('assert');\n\n vows.describe('Deep Thought').addBatch({\n 'An instance of DeepThought': {\n topic: new DeepThought,\n\n 'should know the answer to the ultimate question of life': function (deepThought) {\n assert.equal (deepThought.question('what is the answer to the universe?'), 42);\n }\n }\n });\n\ncoverage reporting\n------------------\nCode coverage reporting is available if _instrumented_ code is detected. Currently only _instrumentation_ via [node-jscoverage](https://github.com/visionmedia/node-jscoverage) is supported. When _instrumented_ code is detected and coverage reporting is enabled using any of the `--cover-plain`, `--cover-html`, or `--cover-json` options a code coverage map is generated.\n\n### downloading and installing [node-jscoverage](https://github.com/visionmedia/node-jscoverage)\n[node-jscoverage](https://github.com/visionmedia/node-jscoverage) is a binary package that needs to be compiled from source:\n\n $ git clone https://github.com/visionmedia/node-jscoverage.git\n $ cd node-jscoverage/\n $ ./configure\n checking for a BSD-compatible install... /usr/bin/install -c\n checking whether build environment is sane... yes\n [...]\n $ make && sudo make install\n\n### instrumenting with jscoverage\n\n $ jscoverage myfile.js myfile-instrumented.js\n \ninstallation\n------------\n\n $ npm install vows\n\ndocumentation\n-------------\n\nHead over to \n\nauthors\n-------\n\nAlexis Sellier <>, Charlie Robbins,\n\n*...and many others*\n\n", - "_id": "vows@0.6.4", - "_from": "vows@*" -} diff --git a/node_modules/vows/test/VowsCamelCaseTest.js b/node_modules/vows/test/VowsCamelCaseTest.js deleted file mode 100644 index 8923f1e..0000000 --- a/node_modules/vows/test/VowsCamelCaseTest.js +++ /dev/null @@ -1,14 +0,0 @@ -var vows = require('../lib/vows'), - assert = require('assert'); - -vows.describe("Vows test file with camel case").addBatch({ - - "The test file": { - topic: function () { - return { flag: true }; - }, - "is run": function (topic) { - assert.isTrue(topic.flag); - } - } -}).export(module); diff --git a/node_modules/vows/test/assert-test.js b/node_modules/vows/test/assert-test.js deleted file mode 100644 index 93d934c..0000000 --- a/node_modules/vows/test/assert-test.js +++ /dev/null @@ -1,137 +0,0 @@ -var vows = require('../lib/vows'); -var assert = require('assert'); - -vows.describe('vows/assert').addBatch({ - "The Assertion module": { - "`equal`": function () { - assert.equal("hello world", "hello world"); - assert.equal(1, true); - }, - "`epsilon`": function() { - assert.epsilon(1e-5, 0.1+0.2, 0.3); - }, - "`match`": function () { - assert.match("hello world", /^[a-z]+ [a-z]+$/); - }, - "`lengthOf`": function () { - assert.lengthOf("hello world", 11); - assert.lengthOf([1, 2, 3], 3); - assert.lengthOf({goo: true, gies: false}, 2); - }, - "`isDefined`": function () { - assert.isDefined(null); - assertError(assert.isDefined, undefined); - }, - "`include`": function () { - assert.include("hello world", "world"); - assert.include([0, 42, 0], 42); - assert.include({goo:true}, 'goo'); - }, - "`deepInclude`": function () { - assert.deepInclude([{a:'b'},{c:'d'}], {a:'b'}); - assert.deepInclude("hello world", "world"); - assert.deepInclude({goo:true}, 'goo'); - }, - "`typeOf`": function () { - assert.typeOf('goo', 'string'); - assert.typeOf(42, 'number'); - assert.typeOf([], 'array'); - assert.typeOf({}, 'object'); - assert.typeOf(false, 'boolean'); - }, - "`instanceOf`": function () { - assert.instanceOf([], Array); - assert.instanceOf(function () {}, Function); - }, - "`isArray`": function () { - assert.isArray([]); - assertError(assert.isArray, {}); - }, - "`isString`": function () { - assert.isString(""); - }, - "`isObject`": function () { - assert.isObject({}); - assertError(assert.isObject, []); - }, - "`isNumber`": function () { - assert.isNumber(0); - }, - "`isBoolean`": function (){ - assert.isBoolean(true); - assert.isBoolean(false); - assertError(assert.isBoolean, 0); - }, - "`isNan`": function () { - assert.isNaN(0/0); - }, - "`isTrue`": function () { - assert.isTrue(true); - assertError(assert.isTrue, 1); - }, - "`isFalse`": function () { - assert.isFalse(false); - assertError(assert.isFalse, 0); - }, - "`isZero`": function () { - assert.isZero(0); - assertError(assert.isZero, null); - }, - "`isNotZero`": function () { - assert.isNotZero(1); - }, - "`isUndefined`": function () { - assert.isUndefined(undefined); - assertError(assert.isUndefined, null); - }, - "`isDefined`": function () { - assert.isDefined(null); - assertError(assert.isDefined, undefined); - }, - "`isNull`": function () { - assert.isNull(null); - assertError(assert.isNull, 0); - assertError(assert.isNull, undefined); - }, - "`isNotNull`": function () { - assert.isNotNull(0); - }, - "`greater` and `lesser`": function () { - assert.greater(5, 4); - assert.lesser(4, 5); - }, - "`inDelta`": function () { - assert.inDelta(42, 40, 5); - assert.inDelta(42, 40, 2); - assert.inDelta(42, 42, 0); - assert.inDelta(3.1, 3.0, 0.2); - assertError(assert.inDelta, [42, 40, 1]); - }, - "`isEmpty`": function () { - assert.isEmpty({}); - assert.isEmpty([]); - assert.isEmpty(""); - }, - "`isNotEmpty`": function () { - assert.isNotEmpty({goo:true}); - assert.isNotEmpty([1]); - assert.isNotEmpty(" "); - assertError(assert.isNotEmpty, {}); - assertError(assert.isNotEmpty, []); - assertError(assert.isNotEmpty, ""); - } - } -}).export(module); - -function assertError(assertion, args, fail) { - if (!Array.isArray(args)) { args = [args]; } - try { - assertion.apply(null, args); - fail = true; - } catch (e) {/* Success */} - - fail && assert.fail(args.join(' '), assert.AssertionError, - "expected an AssertionError for {actual}", - "assertError", assertError); -} - diff --git a/node_modules/vows/test/fixtures/isolate/failing.js b/node_modules/vows/test/fixtures/isolate/failing.js deleted file mode 100644 index 7a1865e..0000000 --- a/node_modules/vows/test/fixtures/isolate/failing.js +++ /dev/null @@ -1,18 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('failing').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, false); - }, - 'should work': function (result) { - assert.ok(result); - } - // but it won't - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/log.js b/node_modules/vows/test/fixtures/isolate/log.js deleted file mode 100644 index 9828045..0000000 --- a/node_modules/vows/test/fixtures/isolate/log.js +++ /dev/null @@ -1,18 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('stderr').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, true); - }, - 'should work': function (result) { - console.log('oh no!'); - assert.ok(result); - } - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/passing.js b/node_modules/vows/test/fixtures/isolate/passing.js deleted file mode 100644 index 7f95730..0000000 --- a/node_modules/vows/test/fixtures/isolate/passing.js +++ /dev/null @@ -1,17 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('passing').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, true); - }, - 'should work': function (result) { - assert.ok(result); - } - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/stderr.js b/node_modules/vows/test/fixtures/isolate/stderr.js deleted file mode 100644 index 545ad20..0000000 --- a/node_modules/vows/test/fixtures/isolate/stderr.js +++ /dev/null @@ -1,18 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('stderr').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, true); - }, - 'should work': function (result) { - console.error('oh no!'); - assert.ok(result); - } - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/supress-stdout/output.js b/node_modules/vows/test/fixtures/supress-stdout/output.js deleted file mode 100644 index e5c1635..0000000 --- a/node_modules/vows/test/fixtures/supress-stdout/output.js +++ /dev/null @@ -1,16 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -vows.describe('output').addBatch({ - 'outputting': { - topic: function () { - console.log('goo'); - this.callback(null, true); - }, - 'should work': function (result) { - console.log('goo'); - assert.ok(result); - } - }, -}).export(module); - diff --git a/node_modules/vows/test/isolate-test.js b/node_modules/vows/test/isolate-test.js deleted file mode 100644 index 40f993b..0000000 --- a/node_modules/vows/test/isolate-test.js +++ /dev/null @@ -1,140 +0,0 @@ -var vows = require('../lib/vows'), - assert = require('assert'), - path = require('path'), - exec = require('child_process').exec; - -function generateTopic(args, file) { - return function () { - var cmd = './bin/vows' + ' -i ' + (args || '') + - ' ./test/fixtures/isolate/' + file, - options = {cwd: path.resolve(__dirname + '/../')}, - callback = this.callback; - - exec(cmd, options, function (err, stdout, stderr) { - callback(null, { - err: err, - stdout: stdout, - stderr: stderr - }); - }); - } -}; - -function assertExecOk(r) { - assert.isNull(r.err); -} - -function assertExecNotOk(r) { - assert.isNotNull(r.err); -} - -function parseResults(stdout) { - return stdout.split(/\n/g).map(function (s) { - if (!s) return; - return JSON.parse(s); - }).filter(function (s) {return s}); -} - -function assertResultTypePresent(results, type) { - assert.ok(results.some(function (result) { - return result[0] == type; - })); -} - -function assertResultsFinish(results, expected) { - var finish = results[results.length - 1]; - assert.equal(finish[0], 'finish'); - - finish = finish[1]; - - Object.keys(expected).forEach(function (key) { - assert.equal(finish[key], expected[key]); - }); -} - -vows.describe('vows/isolate').addBatch({ - 'Running vows with -i flag for test/fixtures/isolate/': { - 'passing.js': { - 'with default reporter': { - topic: generateTopic(null, 'passing.js'), - 'should be ok': assertExecOk - }, - 'with json reporter': { - topic: generateTopic('--json', 'passing.js'), - 'should be ok': assertExecOk, - 'should have correct output': function (r) { - var results = parseResults(r.stdout) - - assertResultTypePresent(results, 'subject'); - assertResultTypePresent(results, 'end'); - - assertResultsFinish(results, { - total: 4, - honored: 4 - }); - } - } - }, - 'failing.js': { - 'with json reporter': { - topic: generateTopic('--json', 'failing.js'), - 'should be not ok': assertExecNotOk, - 'should have correct output though': function (r) { - var results = parseResults(r.stdout); - - assertResultsFinish(results, { - total: 4, - broken: 4 - }); - } - } - }, - 'stderr.js': { - 'with json reporter': { - topic: generateTopic('--json', 'stderr.js'), - 'should be ok': assertExecOk, - 'should have stderr': function (r) { - assert.equal(r.stderr, - ['oh no!', 'oh no!', 'oh no!', 'oh no!', ''].join('\n')); - }, - 'should have correct output': function (r) { - var results= parseResults(r.stdout); - - assertResultsFinish(results, { - total: 4, - honored: 4 - }); - } - } - }, - 'log.js': { - 'with json reporter': { - topic: generateTopic('--json', 'log.js'), - 'should be ok': assertExecOk, - 'should have correct output': function (r) { - var results= parseResults(r.stdout); - - assertResultsFinish(results, { - total: 4, - honored: 4 - }); - } - } - }, - 'all tests (*)': { - 'with json reporter': { - topic: generateTopic('--json', '*'), - 'should be not ok': assertExecNotOk, - 'should have correct output': function (r) { - var results= parseResults(r.stdout); - - assertResultsFinish(results, { - total: 16, - broken: 4, - honored: 12 - }); - } - } - } - } -}).export(module); diff --git a/node_modules/vows/test/supress-stdout-test.js b/node_modules/vows/test/supress-stdout-test.js deleted file mode 100644 index 2321e4d..0000000 --- a/node_modules/vows/test/supress-stdout-test.js +++ /dev/null @@ -1,43 +0,0 @@ -var assert = require('assert'), - path = require('path'), - vows = require('../lib/vows'), - exec = require('child_process').exec; - -function generateTopic(supress) { - return function () { - var cmd = './bin/vows ' + (supress ? '--supress-stdout ' : '') + - './test/fixtures/supress-stdout/output.js', - options = {cwd: path.resolve(__dirname + '/../')}, - callback = this.callback; - - exec(cmd, options, function (err, stdout) { - callback(null, {err: err, stdout: stdout}); - }); - }; -} - -vows.describe('vows/supress-stdout').addBatch({ - 'Running vows for test/fixtures/supress-stdout/output.js': { - 'with --supress-stdout flag': { - topic: generateTopic(true), - 'should be ok': function (result) { - assert.isNull(result.err); - }, - 'should not contain output from stdout': function (result) { - assert.equal(result.stdout.toString().indexOf('goo'), -1); - // console.log output? - // nope, just Chuck Testa! - } - }, - 'without --supress-stdout flag': { - topic: generateTopic(), - 'should be ok': function (result) { - assert.isNull(result.err); - }, - 'should contain output from stdout': function (result) { - assert.notEqual(result.stdout.toString().indexOf('goo'), -1); - } - } - } -}).export(module); - diff --git a/node_modules/vows/test/vows-error-test.js b/node_modules/vows/test/vows-error-test.js deleted file mode 100644 index 79afaba..0000000 --- a/node_modules/vows/test/vows-error-test.js +++ /dev/null @@ -1,51 +0,0 @@ -var path = require('path'), - events = require('events'), - assert = require('assert'), - fs = require('fs'), - vows = require('../lib/vows'); - -function doSomethingAsync(callback) { - var err = null; - var testValue = 'a'; - - process.nextTick(function() { - callback(err, testValue); - }); -} - -function doSomethingAsyncWithError(callback) { - var err = true; - var testValue = 'a'; - - process.nextTick(function() { - callback(err, testValue); - }); -} - - -vows.describe('vows/error').addBatch({ - 'Generate success response to async function': { - topic: function() { - doSomethingAsync(this.callback) - }, - 'Validate success': function(err, testValue) { - assert.ok(!err); - }, - 'Validate testValue': function(err, testValue) { - assert.equal(testValue, 'a'); - } - }, - - 'Generate error response to async function': { - topic: function() { - doSomethingAsyncWithError(this.callback) - }, - 'Validate error': function(err, testValue) { - assert.ok(err); - }, - 'Validate testValue': function(err, testValue) { - // This assertion fails. It shouldn't. - assert.equal(testValue, 'a'); - } - } -}).export(module) \ No newline at end of file diff --git a/node_modules/vows/test/vows-test.js b/node_modules/vows/test/vows-test.js deleted file mode 100644 index d539a54..0000000 --- a/node_modules/vows/test/vows-test.js +++ /dev/null @@ -1,522 +0,0 @@ -var path = require('path'), - events = require('events'), - assert = require('assert'), - fs = require('fs'), - vows = require('../lib/vows'); - -var api = vows.prepare({ - get: function (id, callback) { - process.nextTick(function () { callback(null, id) }); - }, - version: function () { return '1.0' } -}, ['get']); - -var promiser = function (val) { - return function () { - var promise = new(events.EventEmitter); - process.nextTick(function () { promise.emit('success', val) }); - return promise; - } -}; - -vows.describe("Vows").addBatch({ - "A context": { - topic: promiser("hello world"), - - "with a nested context": { - topic: function (parent) { - this.state = 42; - return promiser(parent)(); - }, - "has access to the environment": function () { - assert.equal(this.state, 42); - }, - "and a sub nested context": { - topic: function () { - return this.state; - }, - "has access to the parent environment": function (r) { - assert.equal(r, 42); - assert.equal(this.state, 42); - }, - "has access to the parent context object": function (r) { - assert.ok(Array.isArray(this.context.topics)); - assert.include(this.context.topics, "hello world"); - } - } - } - }, - "A nested context": { - topic: promiser(1), - - ".": { - topic: function (a) { return promiser(2)() }, - - ".": { - topic: function (b, a) { return promiser(3)() }, - - ".": { - topic: function (c, b, a) { return promiser([4, c, b, a])() }, - - "should have access to the parent topics": function (topics) { - assert.equal(topics.join(), [4, 3, 2, 1].join()); - } - }, - - "from": { - topic: function (c, b, a) { return promiser([4, c, b, a])() }, - - "the parent topics": function(topics) { - assert.equal(topics.join(), [4, 3, 2, 1].join()); - } - } - } - } - }, - "Nested contexts with callback-style async": { - topic: function () { - fs.stat(__dirname + '/vows-test.js', this.callback); - }, - 'after a successful `fs.stat`': { - topic: function (stat) { - fs.open(__dirname + '/vows-test.js', "r", stat.mode, this.callback); - }, - 'after a successful `fs.open`': { - topic: function (fd, stat) { - fs.read(fd, stat.size, 0, "utf8", this.callback); - }, - 'after a successful `fs.read`': function (data) { - assert.match (data, /after a successful `fs.read`/); - } - } - } - }, - "A nested context with no topics": { - topic: 45, - ".": { - ".": { - "should pass the value down": function (topic) { - assert.equal(topic, 45); - } - } - } - }, - "A Nested context with topic gaps": { - topic: 45, - ".": { - ".": { - topic: 101, - ".": { - ".": { - topic: function (prev, prev2) { - return this.context.topics.slice(0); - }, - "should pass the topics down": function (topics) { - assert.lengthOf(topics, 2); - assert.equal(topics[0], 101); - assert.equal(topics[1], 45); - } - } - } - } - } - }, - "A non-promise return value": { - topic: function () { return 1 }, - "should be converted to a promise": function (val) { - assert.equal(val, 1); - } - }, - "A 'prepared' interface": { - "with a wrapped function": { - topic: function () { return api.get(42) }, - "should work as expected": function (val) { - assert.equal(val, 42); - } - }, - "with a non-wrapped function": { - topic: function () { return api.version() }, - "should work as expected": function (val) { - assert.equal(val, '1.0'); - } - } - }, - "A non-function topic": { - topic: 45, - - "should work as expected": function (topic) { - assert.equal(topic, 45); - } - }, - "A non-function topic with a falsy value": { - topic: 0, - - "should work as expected": function (topic) { - assert.equal(topic, 0); - } - }, - "A topic returning a function": { - topic: function () { - return function () { return 42 }; - }, - - "should work as expected": function (topic) { - assert.isFunction(topic); - assert.equal(topic(), 42); - }, - "in a sub-context": { - "should work as expected": function (topic) { - assert.isFunction(topic); - assert.equal(topic(), 42); - }, - } - }, - "A topic with a function that errors": { - topic: function() { - throw("Something wrong here"); - }, - "should error out": function(topic) { - assert.equal(topic, "Something wrong here"); - } - }, - "A topic emitting an error": { - topic: function () { - var promise = new(events.EventEmitter); - process.nextTick(function () { - promise.emit("error", 404); - }); - return promise; - }, - "shouldn't raise an exception if the test expects it": function (e, res) { - assert.equal(e, 404); - assert.ok(! res); - } - }, - "A topic not emitting an error": { - topic: function () { - var promise = new(events.EventEmitter); - process.nextTick(function () { - promise.emit("success", true); - }); - return promise; - }, - "should pass `null` as first argument, if the test is expecting an error": function (e, res) { - assert.strictEqual(e, null); - assert.equal(res, true); - }, - "should pass the result as first argument if the test isn't expecting an error": function (res) { - assert.equal(res, true); - } - }, - "A topic with callback-style async": { - "when successful": { - topic: function () { - var that = this; - process.nextTick(function () { - that.callback(null, "OK"); - }); - }, - "should work like an event-emitter": function (res) { - assert.equal(res, "OK"); - }, - "should assign `null` to the error argument": function (e, res) { - assert.strictEqual(e, null); - assert.equal(res, "OK"); - } - }, - "when unsuccessful": { - topic: function () { - function async(callback) { - process.nextTick(function () { - callback("ERROR"); - }); - } - async(this.callback); - }, - "should have a non-null error value": function (e, res) { - assert.equal(e, "ERROR"); - }, - "should work like an event-emitter": function (e, res) { - assert.equal(res, undefined); - } - }, - "using this.callback synchronously": { - topic: function () { - this.callback(null, 'hello'); - }, - "should work the same as returning a value": function (res) { - assert.equal(res, 'hello'); - } - }, - "using this.callback with a user context": { - topic: function () { - this.callback.call({ boo: true }, null, 'hello'); - }, - "should give access to the user context": function (res) { - assert.isTrue(this.boo); - } - }, - "passing this.callback to a function": { - topic: function () { - this.boo = true; - var async = function (callback) { - callback(null); - }; - async(this.callback); - }, - "should give access to the topic context": function () { - assert.isTrue(this.boo); - } - }, - "with multiple arguments": { - topic: function () { - this.callback(null, 1, 2, 3); - }, - "should pass them to the vow": function (e, a, b, c) { - assert.strictEqual(e, null); - assert.strictEqual(a, 1); - assert.strictEqual(b, 2); - assert.strictEqual(c, 3); - }, - "and a sub-topic": { - topic: function (a, b, c) { - return [a, b, c]; - }, - "should receive them too": function (val) { - assert.deepEqual(val, [1, 2, 3]); - } - } - } - } -}).addBatch({ - "A Sibling context": { - "'A', with `this.foo = true`": { - topic: function () { - this.foo = true; - return this; - }, - "should have `this.foo` set to true": function (res) { - assert.equal(res.foo, true); - } - }, - "'B', with nothing set": { - topic: function () { - return this; - }, - "shouldn't have access to `this.foo`": function (e, res) { - assert.isUndefined(res.foo); - } - } - } -}).addBatch({ - "A 2nd batch": { - topic: function () { - var p = new(events.EventEmitter); - setTimeout(function () { - p.emit("success"); - }, 100); - return p; - }, - "should run after the first": function () {} - } -}).addBatch({ - "A 3rd batch": { - topic: true, "should run last": function () {} - } -}).addBatch({}).export(module); - -vows.describe("Vows with a single batch", { - "This is a batch that's added as the optional parameter to describe()": { - topic: true, - "And a vow": function () {} - } -}).export(module); - -vows.describe("Vows with multiple batches added as optional parameters", { - "First batch": { - topic: true, - "should be run first": function () {} - } -}, { - "Second batch": { - topic: true, - "should be run second": function () {} - } -}).export(module); - -vows.describe("Vows with teardowns").addBatch({ - "A context": { - topic: function () { - return { flag: true }; - }, - "And a vow": function (topic) { - assert.isTrue(topic.flag); - }, - "And another vow": function (topic) { - assert.isTrue(topic.flag); - }, - "And a final vow": function (topic) { - assert.isTrue(topic.flag); - }, - 'subcontext': { - 'nested': function (_, topic) { - assert.isTrue(topic.flag); - } - }, - teardown: function (topic) { - topic.flag = false; - }, - "with a subcontext" : { - topic: function (topic) { - var that = this; - process.nextTick(function () { - that.callback(null, topic); - }); - }, - "Waits for the subcontext before teardown" : function(topic) { - assert.isTrue(topic.flag); - } - } - } -}).export(module); - -vows.describe("Vows with sub events").addBatch({ - "A context with sub-events": { - topic: function () { - var topic = new(events.EventEmitter); - topic.emit('before', 'before'); - - process.nextTick(function () { - topic.emit('request', 'request_data'); - }); - - process.nextTick(function () { - topic.emit('end', 'end_data'); - }); - - process.nextTick(function () { - topic.emit('nested', 'empty_nest'); - }); - - process.nextTick(function () { - topic.emit('success', 'legacey_data'); - }); - - return topic; - }, - on: { - "before": { - "will catch events emited before the topic returns" : function (ret) { - assert.strictEqual(ret, 'before'); - } - }, - "request": { - "will catch request": function (ret) { - assert.strictEqual(ret, 'request_data'); - }, - on: { - on: { - "end": { - "will require that 'end' is emitted after 'request'": function (ret) { - assert.strictEqual(ret, 'end_data'); - // TODO need a test that fails to prove this works - } - } - } - } - }, - on: { - on: { - "nested": { - "will catch nested, even if it is in empty nested 'on'": function (ret) { - assert.strictEqual(ret, 'empty_nest') - } - } - } - } - }, - "will catch the legacy success event": function (err, ret) { - assert.strictEqual(ret, 'legacey_data'); - } - }, - "Sub-events emitted by children of EventEmitter": { - topic: function() { - var MyEmitter = function () { - events.EventEmitter.call(this); - }; - require('util').inherits(MyEmitter, events.EventEmitter); - - var topic = new(MyEmitter); - process.nextTick(function () { - topic.emit('success', 'Legacy Does not Catch'); - }); - - return topic; - }, - "will return the emitter for traditional vows" : function (err, ret) { - assert.ok(ret instanceof events.EventEmitter); - }, - // events is an alias for on - events: { - "success" : { - "will catch the event" : function (ret) { - assert.strictEqual(ret, 'Legacy Does not Catch'); - }, - "will change events to on in the title" : function() { - assert.strictEqual(this.context.title, - 'Sub-events emitted by children of EventEmitter on success'); - } - } - } - } -}).export(module); - -var tornDown = false - -vows.describe("Vows with asynchonous teardowns").addBatch({ - "Context with long-running teardown": { - "is run first": function () {}, - teardown: function () { - var callback = this.callback; - - setTimeout(function () { - tornDown = true; - callback(); - }, 100); - } - } -}).addBatch({ - "The next batch": { - "is not run until the teardown is complete": function () { - assert.ok(tornDown); - } - } -}).export(module); - -vows.describe('Async topic is passed to vows with topic-less subcontext').addBatch({ - 'Async 42': { - topic: function () { - var callback = this.callback; - process.nextTick(function () { - callback(null, 42); - }); - }, - 'equals 42': function (topic) { - assert.equal(topic, 42); - }, - 'has the property that': { - 'it is equal to 42': function (topic) { - // <-- This vow fails, topic is undefined!? - assert.equal(topic, 42); - } - }, - 'plus 1': { - topic: function (parentTopic) { - return parentTopic + 1; - }, - 'equals 43': function (topic) { - assert.equal(topic, 43); - } - } - } -})['export'](module); diff --git a/node_modules/vows/test/vows_underscore_test.js b/node_modules/vows/test/vows_underscore_test.js deleted file mode 100644 index 1f3ce5c..0000000 --- a/node_modules/vows/test/vows_underscore_test.js +++ /dev/null @@ -1,14 +0,0 @@ -var vows = require('../lib/vows'), - assert = require('assert'); - -vows.describe("Vows test file with underscore").addBatch({ - - "The test file": { - topic: function () { - return { flag: true }; - }, - "is run": function (topic) { - assert.isTrue(topic.flag); - } - } -}).export(module); diff --git a/node_modules/waitress/README.md b/node_modules/waitress/README.md deleted file mode 100644 index 615e5a4..0000000 --- a/node_modules/waitress/README.md +++ /dev/null @@ -1,38 +0,0 @@ - -### Basic Usage - -```javascript -var done = waitress(count, cb); -``` - -Waitress returns a function, `done`, that will wait to be called `count` times before executing the `cb` passed into it. - -```javascript -var done = waitress(3, function(err) { - if (err) throw err; -}); - -done(); -done(new Error('oh noes')); // causes callback to be fired with an error condition -done(false); // also causes callback to be fired with an error condition -``` - -### Getting results - -If done receives a second parameter, waitress will add that to an array, -which will be the second parameter given to the callback, as long as it -receives no errors. - -The array will be built in the order the data is received, not the order -done appears in your code. - -```javascript -var done = waitress(3, function(err, result) { - if (err) throw err; - result === ['a', 'b', 'c']; -}); - -done(null, 'a'); -done(null, 'b'); -done(null, 'c'); -``` diff --git a/node_modules/waitress/index.js b/node_modules/waitress/index.js deleted file mode 100644 index 6885fea..0000000 --- a/node_modules/waitress/index.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; - -var waitress = function(count, cb) { - if (count === 0) { - cb(null); - return function() {}; - } - - var done = 0 - , cberr = null - , results - , args; - - var next = (function(err, result) { - ++done; - if (err instanceof Error) { - cberr = err; - } else if (err === false) { - cberr = cberr || new Error; - } - if (result !== undefined) { - results = results || [] - results.push(result); - } - if (done === count) { - args = [cberr]; - if (results && results.length) { - args.push(results); - } - cb.apply(null, args); - } - }); - return next; -}; - -module.exports = waitress; diff --git a/node_modules/waitress/package.json b/node_modules/waitress/package.json deleted file mode 100644 index 46ae683..0000000 --- a/node_modules/waitress/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "waitress", - "description": "Simple flow control for multiple parallel async calls.", - "author": { - "name": "Adam Blackburn", - "email": "adam@ifit.com" - }, - "version": "0.1.2", - "main": "index.js", - "keywords": [ - "flow-control", - "flow", - "waitress", - "async", - "parallel", - "callback" - ], - "repository": { - "type": "git", - "url": "git://github.com/ifit/waitress.git" - }, - "homepage": "https://github.com/ifit/waitress", - "readme": "\n### Basic Usage\n\n```javascript\nvar done = waitress(count, cb);\n```\n\nWaitress returns a function, `done`, that will wait to be called `count` times before executing the `cb` passed into it.\n\n```javascript\nvar done = waitress(3, function(err) {\n if (err) throw err;\n});\n\ndone();\ndone(new Error('oh noes')); // causes callback to be fired with an error condition\ndone(false); // also causes callback to be fired with an error condition\n```\n\n### Getting results\n\nIf done receives a second parameter, waitress will add that to an array,\nwhich will be the second parameter given to the callback, as long as it\nreceives no errors.\n\nThe array will be built in the order the data is received, not the order\ndone appears in your code.\n\n```javascript\nvar done = waitress(3, function(err, result) {\n if (err) throw err;\n result === ['a', 'b', 'c'];\n});\n\ndone(null, 'a');\ndone(null, 'b');\ndone(null, 'c');\n```\n", - "_id": "waitress@0.1.2", - "_from": "waitress@>=0.0.2" -} diff --git a/node_modules/waitress/test.js b/node_modules/waitress/test.js deleted file mode 100644 index bfc92ab..0000000 --- a/node_modules/waitress/test.js +++ /dev/null @@ -1,63 +0,0 @@ -var waitress = require('./index') - , assert = require('assert'); - -assert.throws(function() { - var done = waitress(3, function(err) { - if (err) throw err; - }); - - done(); - done(); - done(false); -}); - -assert.throws(function() { - var done = waitress(1, function(err) { - if (err) throw err; - }); - - done(new Error('hai tai mai shu')); -}, /hai tai mai shu/); - -// for zero args -assert.throws(function() { - var done = waitress(0, function(err) { - throw(new Error("zero args hurrr")); - }); -}, /zero args hurrr/); - -assert.doesNotThrow(function() { - var done = waitress(3, function(err) { - if (err) throw err; - }); - - done(); - done(); - done(); - done(false); -}); - -assert.throws(function() { - var done = waitress(3, function(err, results) { - if (err) throw err; - }); - - done(); - done(new Error("nein nein nein")); - done(new Error("no no no")); -}, /no no no/); - -(function() { - var done = waitress(3, function(err, results) { - if (err) throw err; - assert.deepEqual(results, [1, 2, 3], "results aggregation wrong"); - }); - - done(null, 1); - done(null, 2); - done(null, 3); - done(null, 4); -})(); - -console.log("No errors thrown, all tests must have passed."); - From 63ffe97b0d81ead687b17ac004d2d898423ad764 Mon Sep 17 00:00:00 2001 From: Chase Brammer Date: Fri, 19 Oct 2012 15:37:50 -0600 Subject: [PATCH 5/7] getting rid of modules for now --- .gitignore | 38 ++++++-------------------------------- package.json | 7 +------ 2 files changed, 7 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 7b47def..823ac3f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,11 @@ lib-cov *.seed *.log *.node +*.o +*.o.d +*.mk +*.gypi +*.cache.py *.wafpickle-7 *.lock-wscript *.csv @@ -27,35 +32,4 @@ npm-debug.log .build /docs - -/node_modules/googlemaps -/node_modules/baptize -/node_modules/boilerplate -/node_modules/challenges -/node_modules/calorie-calculator -/node_modules/equipment -/node_modules/interactions -/node_modules/log-workout -/node_modules/maps -/node_modules/user -/node_modules/tempest -/node_modules/admin -/node_modules/achievements -/node_modules/workout-manager -/node_modules/payment-api -/node_modules/media -/node_modules/action-pipeline -/node_modules/geolib -/node_modules/winston-pulse -/node_modules/paymentApi -/node_modules/legacy-api -/node_modules/log-biometric -/node_modules/gpx-parser -/node_modules/wpl2 -/node_modules/soap -/node_modules/sketch -/node_modules/oauth -/node_modules/ifit-mail -/node_modules/static-map -/node_modules/workout-translator - +/node_modules \ No newline at end of file diff --git a/package.json b/package.json index 7de4c30..fd94583 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,6 @@ "geo", "api" ], - "bundledDependencies": [ - "request", - "waitress", - "vows" - ], "repository": { "type": "git", "url": "http://github.com/moshen/node-googlemaps" @@ -30,4 +25,4 @@ "scripts": { "test": "NODE_ENV=test vows test/*.js --spec" } -} +} \ No newline at end of file From b75f6efa8b6202b9951da00fa1e47047aac482fd Mon Sep 17 00:00:00 2001 From: Chase Brammer Date: Fri, 19 Oct 2012 15:37:58 -0600 Subject: [PATCH 6/7] getting rid of modules for now --- .gitignore | 38 +- node_modules/.bin/vows | 1 - node_modules/request/LICENSE | 55 -- node_modules/request/README.md | 285 -------- node_modules/request/main.js | 618 ----------------- node_modules/request/mimetypes.js | 146 ---- node_modules/request/oauth.js | 34 - node_modules/request/package.json | 32 - node_modules/request/tests/googledoodle.png | Bin 38510 -> 0 bytes node_modules/request/tests/run.sh | 6 - node_modules/request/tests/server.js | 57 -- node_modules/request/tests/test-body.js | 90 --- node_modules/request/tests/test-cookie.js | 29 - node_modules/request/tests/test-cookiejar.js | 90 --- node_modules/request/tests/test-errors.js | 30 - node_modules/request/tests/test-oauth.js | 109 --- node_modules/request/tests/test-pipes.js | 167 ----- node_modules/request/tests/test-proxy.js | 39 -- node_modules/request/tests/test-timeout.js | 87 --- node_modules/request/uuid.js | 19 - node_modules/request/vendor/cookie/index.js | 55 -- node_modules/request/vendor/cookie/jar.js | 72 -- node_modules/vows/.npmignore | 1 - node_modules/vows/.travis.yml | 6 - node_modules/vows/LICENSE | 20 - node_modules/vows/Makefile | 7 - node_modules/vows/README.md | 65 -- node_modules/vows/bin/vows | 579 ---------------- node_modules/vows/lib/assert/error.js | 152 ----- node_modules/vows/lib/assert/macros.js | 222 ------- node_modules/vows/lib/assert/utils.js | 77 --- node_modules/vows/lib/vows.js | 256 ------- node_modules/vows/lib/vows/console.js | 140 ---- node_modules/vows/lib/vows/context.js | 76 --- node_modules/vows/lib/vows/coverage/file.js | 29 - .../coverage/fragments/coverage-foot.html | 3 - .../coverage/fragments/coverage-head.html | 300 --------- .../vows/lib/vows/coverage/report-html.js | 133 ---- .../vows/lib/vows/coverage/report-json.js | 54 -- .../vows/lib/vows/coverage/report-plain.js | 38 -- .../vows/lib/vows/coverage/report-xml.js | 81 --- node_modules/vows/lib/vows/extras.js | 28 - .../vows/lib/vows/reporters/dot-matrix.js | 67 -- node_modules/vows/lib/vows/reporters/json.js | 33 - .../vows/lib/vows/reporters/silent.js | 8 - node_modules/vows/lib/vows/reporters/spec.js | 42 -- node_modules/vows/lib/vows/reporters/tap.js | 100 --- node_modules/vows/lib/vows/reporters/watch.js | 37 -- node_modules/vows/lib/vows/reporters/xunit.js | 90 --- node_modules/vows/lib/vows/suite.js | 386 ----------- node_modules/vows/node_modules/diff/LICENSE | 31 - node_modules/vows/node_modules/diff/README.md | 94 --- node_modules/vows/node_modules/diff/diff.js | 296 --------- .../vows/node_modules/diff/index.html | 89 --- .../vows/node_modules/diff/package.json | 42 -- node_modules/vows/node_modules/diff/style.css | 81 --- .../vows/node_modules/diff/test/diffTest.js | 625 ------------------ node_modules/vows/node_modules/eyes/LICENSE | 20 - node_modules/vows/node_modules/eyes/Makefile | 4 - node_modules/vows/node_modules/eyes/README.md | 73 -- .../vows/node_modules/eyes/lib/eyes.js | 236 ------- .../vows/node_modules/eyes/package.json | 39 -- .../vows/node_modules/eyes/test/eyes-test.js | 56 -- node_modules/vows/package.json | 40 -- node_modules/vows/test/VowsCamelCaseTest.js | 14 - node_modules/vows/test/assert-test.js | 137 ---- .../vows/test/fixtures/isolate/failing.js | 18 - .../vows/test/fixtures/isolate/log.js | 18 - .../vows/test/fixtures/isolate/passing.js | 17 - .../vows/test/fixtures/isolate/stderr.js | 18 - .../test/fixtures/supress-stdout/output.js | 16 - node_modules/vows/test/isolate-test.js | 140 ---- node_modules/vows/test/supress-stdout-test.js | 43 -- node_modules/vows/test/vows-error-test.js | 51 -- node_modules/vows/test/vows-test.js | 522 --------------- .../vows/test/vows_underscore_test.js | 14 - node_modules/waitress/README.md | 38 -- node_modules/waitress/index.js | 36 - node_modules/waitress/package.json | 26 - node_modules/waitress/test.js | 63 -- package.json | 7 +- 81 files changed, 7 insertions(+), 7986 deletions(-) delete mode 120000 node_modules/.bin/vows delete mode 100644 node_modules/request/LICENSE delete mode 100644 node_modules/request/README.md delete mode 100644 node_modules/request/main.js delete mode 100644 node_modules/request/mimetypes.js delete mode 100644 node_modules/request/oauth.js delete mode 100644 node_modules/request/package.json delete mode 100644 node_modules/request/tests/googledoodle.png delete mode 100755 node_modules/request/tests/run.sh delete mode 100644 node_modules/request/tests/server.js delete mode 100644 node_modules/request/tests/test-body.js delete mode 100644 node_modules/request/tests/test-cookie.js delete mode 100644 node_modules/request/tests/test-cookiejar.js delete mode 100644 node_modules/request/tests/test-errors.js delete mode 100644 node_modules/request/tests/test-oauth.js delete mode 100644 node_modules/request/tests/test-pipes.js delete mode 100644 node_modules/request/tests/test-proxy.js delete mode 100644 node_modules/request/tests/test-timeout.js delete mode 100644 node_modules/request/uuid.js delete mode 100644 node_modules/request/vendor/cookie/index.js delete mode 100644 node_modules/request/vendor/cookie/jar.js delete mode 100644 node_modules/vows/.npmignore delete mode 100644 node_modules/vows/.travis.yml delete mode 100644 node_modules/vows/LICENSE delete mode 100644 node_modules/vows/Makefile delete mode 100644 node_modules/vows/README.md delete mode 100755 node_modules/vows/bin/vows delete mode 100644 node_modules/vows/lib/assert/error.js delete mode 100644 node_modules/vows/lib/assert/macros.js delete mode 100644 node_modules/vows/lib/assert/utils.js delete mode 100644 node_modules/vows/lib/vows.js delete mode 100644 node_modules/vows/lib/vows/console.js delete mode 100644 node_modules/vows/lib/vows/context.js delete mode 100644 node_modules/vows/lib/vows/coverage/file.js delete mode 100644 node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html delete mode 100644 node_modules/vows/lib/vows/coverage/fragments/coverage-head.html delete mode 100644 node_modules/vows/lib/vows/coverage/report-html.js delete mode 100644 node_modules/vows/lib/vows/coverage/report-json.js delete mode 100644 node_modules/vows/lib/vows/coverage/report-plain.js delete mode 100644 node_modules/vows/lib/vows/coverage/report-xml.js delete mode 100644 node_modules/vows/lib/vows/extras.js delete mode 100644 node_modules/vows/lib/vows/reporters/dot-matrix.js delete mode 100644 node_modules/vows/lib/vows/reporters/json.js delete mode 100644 node_modules/vows/lib/vows/reporters/silent.js delete mode 100644 node_modules/vows/lib/vows/reporters/spec.js delete mode 100644 node_modules/vows/lib/vows/reporters/tap.js delete mode 100644 node_modules/vows/lib/vows/reporters/watch.js delete mode 100644 node_modules/vows/lib/vows/reporters/xunit.js delete mode 100644 node_modules/vows/lib/vows/suite.js delete mode 100644 node_modules/vows/node_modules/diff/LICENSE delete mode 100644 node_modules/vows/node_modules/diff/README.md delete mode 100644 node_modules/vows/node_modules/diff/diff.js delete mode 100644 node_modules/vows/node_modules/diff/index.html delete mode 100644 node_modules/vows/node_modules/diff/package.json delete mode 100644 node_modules/vows/node_modules/diff/style.css delete mode 100644 node_modules/vows/node_modules/diff/test/diffTest.js delete mode 100644 node_modules/vows/node_modules/eyes/LICENSE delete mode 100644 node_modules/vows/node_modules/eyes/Makefile delete mode 100644 node_modules/vows/node_modules/eyes/README.md delete mode 100644 node_modules/vows/node_modules/eyes/lib/eyes.js delete mode 100644 node_modules/vows/node_modules/eyes/package.json delete mode 100644 node_modules/vows/node_modules/eyes/test/eyes-test.js delete mode 100644 node_modules/vows/package.json delete mode 100644 node_modules/vows/test/VowsCamelCaseTest.js delete mode 100644 node_modules/vows/test/assert-test.js delete mode 100644 node_modules/vows/test/fixtures/isolate/failing.js delete mode 100644 node_modules/vows/test/fixtures/isolate/log.js delete mode 100644 node_modules/vows/test/fixtures/isolate/passing.js delete mode 100644 node_modules/vows/test/fixtures/isolate/stderr.js delete mode 100644 node_modules/vows/test/fixtures/supress-stdout/output.js delete mode 100644 node_modules/vows/test/isolate-test.js delete mode 100644 node_modules/vows/test/supress-stdout-test.js delete mode 100644 node_modules/vows/test/vows-error-test.js delete mode 100644 node_modules/vows/test/vows-test.js delete mode 100644 node_modules/vows/test/vows_underscore_test.js delete mode 100644 node_modules/waitress/README.md delete mode 100644 node_modules/waitress/index.js delete mode 100644 node_modules/waitress/package.json delete mode 100644 node_modules/waitress/test.js diff --git a/.gitignore b/.gitignore index 7b47def..823ac3f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,11 @@ lib-cov *.seed *.log *.node +*.o +*.o.d +*.mk +*.gypi +*.cache.py *.wafpickle-7 *.lock-wscript *.csv @@ -27,35 +32,4 @@ npm-debug.log .build /docs - -/node_modules/googlemaps -/node_modules/baptize -/node_modules/boilerplate -/node_modules/challenges -/node_modules/calorie-calculator -/node_modules/equipment -/node_modules/interactions -/node_modules/log-workout -/node_modules/maps -/node_modules/user -/node_modules/tempest -/node_modules/admin -/node_modules/achievements -/node_modules/workout-manager -/node_modules/payment-api -/node_modules/media -/node_modules/action-pipeline -/node_modules/geolib -/node_modules/winston-pulse -/node_modules/paymentApi -/node_modules/legacy-api -/node_modules/log-biometric -/node_modules/gpx-parser -/node_modules/wpl2 -/node_modules/soap -/node_modules/sketch -/node_modules/oauth -/node_modules/ifit-mail -/node_modules/static-map -/node_modules/workout-translator - +/node_modules \ No newline at end of file diff --git a/node_modules/.bin/vows b/node_modules/.bin/vows deleted file mode 120000 index 0386e59..0000000 --- a/node_modules/.bin/vows +++ /dev/null @@ -1 +0,0 @@ -../vows/bin/vows \ No newline at end of file diff --git a/node_modules/request/LICENSE b/node_modules/request/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/node_modules/request/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/request/README.md b/node_modules/request/README.md deleted file mode 100644 index c30f1a5..0000000 --- a/node_modules/request/README.md +++ /dev/null @@ -1,285 +0,0 @@ -# Request -- Simplified HTTP request method - -## Install - -
-  npm install request
-
- -Or from source: - -
-  git clone git://github.com/mikeal/request.git 
-  cd request
-  npm link
-
- -## Super simple to use - -Request is designed to be the simplest way possible to make http calls. It support HTTPS and follows redirects by default. - -```javascript -var request = require('request'); -request('http://www.google.com', function (error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body) // Print the google web page. - } -}) -``` - -## Streaming - -You can stream any response to a file stream. - -```javascript -request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) -``` - -You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers. - -```javascript -fs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json')) -``` - -Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers. - -```javascript -request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) -``` - -Now let's get fancy. - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - if (req.method === 'PUT') { - req.pipe(request.put('http://mysite.com/doodle.png')) - } else if (req.method === 'GET' || req.method === 'HEAD') { - request.get('http://mysite.com/doodle.png').pipe(resp) - } - } -}) -``` - -You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do: - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - var x = request('http://mysite.com/doodle.png') - req.pipe(x) - x.pipe(resp) - } -}) -``` - -And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :) - -```javascript -req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) -``` - -Also, none of this new functionality conflicts with requests previous features, it just expands them. - -```javascript -var r = request.defaults({'proxy':'http://localproxy.com'}) - -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - r.get('http://google.com/doodle.png').pipe(resp) - } -}) -``` - -You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. - -## OAuth Signing - -```javascript -// Twitter OAuth -var qs = require('querystring') - , oauth = - { callback: 'http://mysite.com/callback/' - , consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - } - , url = 'https://api.twitter.com/oauth/request_token' - ; -request.post({url:url, oauth:oauth}, function (e, r, body) { - // Assume by some stretch of magic you aquired the verifier - var access_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: access_token.oauth_token - , verifier: VERIFIER - , token_secret: access_token.oauth_token_secret - } - , url = 'https://api.twitter.com/oauth/access_token' - ; - request.post({url:url, oauth:oauth}, function (e, r, body) { - var perm_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: perm_token.oauth_token - , token_secret: perm_token.oauth_token_secret - } - , url = 'https://api.twitter.com/1/users/show.json?' - , params = - { screen_name: perm_token.screen_name - , user_id: perm_token.user_id - } - ; - url += qs.stringify(params) - request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { - console.log(user) - }) - }) -}) -``` - - - -### request(options, callback) - -The first argument can be either a url or an options object. The only required option is uri, all others are optional. - -* `uri` || `url` - fully qualified uri or a parsed url object from url.parse() -* `method` - http method, defaults to GET -* `headers` - http headers, defaults to {} -* `body` - entity body for POST and PUT requests. Must be buffer or string. -* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. -* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. -* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true. -* `maxRedirects` - the maximum number of redirects to follow, defaults to 10. -* `onResponse` - If true the callback will be fired on the "response" event instead of "end". If a function it will be called on "response" and not effect the regular semantics of the main callback on "end". -* `encoding` - Encoding to be used on response.setEncoding when buffering the response data. -* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets. -* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. -* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request -* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri. -* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above. -* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option. -* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) - - -The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body buffer. - -## Convenience methods - -There are also shorthand methods for different HTTP METHODs and some other conveniences. - -### request.defaults(options) - -This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. - -### request.put - -Same as request() but defaults to `method: "PUT"`. - -```javascript -request.put(url) -``` - -### request.post - -Same as request() but defaults to `method: "POST"`. - -```javascript -request.post(url) -``` - -### request.head - -Same as request() but defaults to `method: "HEAD"`. - -```javascript -request.head(url) -``` - -### request.del - -Same as request() but defaults to `method: "DELETE"`. - -```javascript -request.del(url) -``` - -### request.get - -Alias to normal request method for uniformity. - -```javascript -request.get(url) -``` -### request.cookie - -Function that creates a new cookie. - -```javascript -request.cookie('cookie_string_here') -``` -### request.jar - -Function that creates a new cookie jar. - -```javascript -request.jar() -``` - - -## Examples: - -```javascript - var request = require('request') - , rand = Math.floor(Math.random()*100000000).toString() - ; - request( - { method: 'PUT' - , uri: 'http://mikeal.iriscouch.com/testjs/' + rand - , multipart: - [ { 'content-type': 'application/json' - , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) - } - , { body: 'I am an attachment' } - ] - } - , function (error, response, body) { - if(response.statusCode == 201){ - console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) - } else { - console.log('error: '+ response.statusCode) - console.log(body) - } - } - ) -``` -Cookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent). - -```javascript -var request = request.defaults({jar: false}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` - -If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option: - -```javascript -var j = request.jar() -var request = request.defaults({jar:j}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` -OR - -```javascript -var j = request.jar() -var cookie = request.cookie('your_cookie_here') -j.add(cookie) -request({url: 'http://www.google.com', jar: j}, function () { - request('http://images.google.com') -}) -``` diff --git a/node_modules/request/main.js b/node_modules/request/main.js deleted file mode 100644 index 7566d1e..0000000 --- a/node_modules/request/main.js +++ /dev/null @@ -1,618 +0,0 @@ -// Copyright 2010-2011 Mikeal Rogers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -var http = require('http') - , https = false - , tls = false - , url = require('url') - , util = require('util') - , stream = require('stream') - , qs = require('querystring') - , mimetypes = require('./mimetypes') - , oauth = require('./oauth') - , uuid = require('./uuid') - , Cookie = require('./vendor/cookie') - , CookieJar = require('./vendor/cookie/jar') - , cookieJar = new CookieJar - ; - -try { - https = require('https') -} catch (e) {} - -try { - tls = require('tls') -} catch (e) {} - -function toBase64 (str) { - return (new Buffer(str || "", "ascii")).toString("base64") -} - -// Hacky fix for pre-0.4.4 https -if (https && !https.Agent) { - https.Agent = function (options) { - http.Agent.call(this, options) - } - util.inherits(https.Agent, http.Agent) - https.Agent.prototype._getConnection = function(host, port, cb) { - var s = tls.connect(port, host, this.options, function() { - // do other checks here? - if (cb) cb() - }) - return s - } -} - -function isReadStream (rs) { - if (rs.readable && rs.path && rs.mode) { - return true - } -} - -function copy (obj) { - var o = {} - for (var i in obj) o[i] = obj[i] - return o -} - -var isUrl = /^https?:/ - -var globalPool = {} - -function Request (options) { - stream.Stream.call(this) - this.readable = true - this.writable = true - - if (typeof options === 'string') { - options = {uri:options} - } - - for (var i in options) { - this[i] = options[i] - } - if (!this.pool) this.pool = globalPool - this.dests = [] - this.__isRequestRequest = true -} -util.inherits(Request, stream.Stream) -Request.prototype.getAgent = function (host, port) { - if (!this.pool[host+':'+port]) { - this.pool[host+':'+port] = new this.httpModule.Agent({host:host, port:port}) - } - return this.pool[host+':'+port] -} -Request.prototype.request = function () { - var self = this - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) return // Print a warning maybe? - self._callback.apply(self, arguments) - self._callbackCalled = true - } - } - - if (self.url) { - // People use this property instead all the time so why not just support it. - self.uri = self.url - delete self.url - } - - if (!self.uri) { - throw new Error("options.uri is a required argument") - } else { - if (typeof self.uri == "string") self.uri = url.parse(self.uri) - } - if (self.proxy) { - if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) - } - - self._redirectsFollowed = self._redirectsFollowed || 0 - self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 - self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true - if (self.followRedirect) - self.redirects = self.redirects || [] - - self.headers = self.headers ? copy(self.headers) : {} - - var setHost = false - if (!self.headers.host) { - self.headers.host = self.uri.hostname - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) - self.headers.host += (':'+self.uri.port) - } - setHost = true - } - - if (self.jar === false) { - // disable cookies - var cookies = false; - self._disableCookies = true; - } else if (self.jar) { - // fetch cookie from the user defined cookie jar - var cookies = self.jar.get({ url: self.uri.href }) - } else { - // fetch cookie from the global cookie jar - var cookies = cookieJar.get({ url: self.uri.href }) - } - if (cookies) { - var cookieString = cookies.map(function (c) { - return c.name + "=" + c.value; - }).join("; "); - - self.headers.Cookie = cookieString; - } - - if (!self.uri.pathname) {self.uri.pathname = '/'} - if (!self.uri.port) { - if (self.uri.protocol == 'http:') {self.uri.port = 80} - else if (self.uri.protocol == 'https:') {self.uri.port = 443} - } - - if (self.proxy) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - if (self.onResponse === true) { - self.onResponse = self.callback - delete self.callback - } - - var clientErrorHandler = function (error) { - if (setHost) delete self.headers.host - if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer) - self.emit('error', error) - } - if (self.onResponse) self.on('error', function (e) {self.onResponse(e)}) - if (self.callback) self.on('error', function (e) {self.callback(e)}) - - if (self.form) { - self.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8' - self.body = qs.stringify(self.form).toString('utf8') - } - - if (self.oauth) { - var form - if (self.headers['content-type'] && - self.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) === - 'application/x-www-form-urlencoded' - ) { - form = qs.parse(self.body) - } - if (self.uri.query) { - form = qs.parse(self.uri.query) - } - if (!form) form = {} - var oa = {} - for (var i in form) oa[i] = form[i] - for (var i in self.oauth) oa['oauth_'+i] = self.oauth[i] - if (!oa.oauth_version) oa.oauth_version = '1.0' - if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString() - if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') - - oa.oauth_signature_method = 'HMAC-SHA1' - - var consumer_secret = oa.oauth_consumer_secret - delete oa.oauth_consumer_secret - var token_secret = oa.oauth_token_secret - delete oa.oauth_token_secret - - var baseurl = self.uri.protocol + '//' + self.uri.host + self.uri.pathname - var signature = oauth.hmacsign(self.method, baseurl, oa, consumer_secret, token_secret) - - // oa.oauth_signature = signature - for (var i in form) { - if ( i.slice(0, 'oauth_') in self.oauth) { - // skip - } else { - delete oa['oauth_'+i] - } - } - self.headers.authorization = - 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') - self.headers.authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"' - } - - if (self.uri.auth && !self.headers.authorization) { - self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization']) { - self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || "") - } - - if (self.path.length === 0) self.path = '/' - - if (self.proxy) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - - if (self.json) { - self.headers['content-type'] = 'application/json' - if (typeof self.json === 'boolean') { - if (typeof self.body === 'object') self.body = JSON.stringify(self.body) - } else { - self.body = JSON.stringify(self.json) - } - - } else if (self.multipart) { - self.body = []; - self.headers['content-type'] = 'multipart/related;boundary="frontier"' - if (!self.multipart.forEach) throw new Error('Argument error, options.multipart.') - - self.multipart.forEach(function (part) { - var body = part.body - if(!body) throw Error('Body attribute missing in multipart.') - delete part.body - var preamble = '--frontier\r\n' - Object.keys(part).forEach(function(key){ - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n'; - self.body.push(new Buffer(preamble)); - self.body.push(new Buffer(body)); - self.body.push(new Buffer('\r\n')); - }) - self.body.push(new Buffer('--frontier--')); - } - - if (self.body) { - var length = 0; - if (!Buffer.isBuffer(self.body)) { - if (Array.isArray(self.body)) { - for (var i = 0; i < self.body.length; i++) { - length += self.body[i].length; - } - } else { - self.body = new Buffer(self.body) - length = self.body.length; - } - } else { - length = self.body.length; - } - if (length) { - self.headers['content-length'] = length; - } else { - throw new Error('Argument error, options.body.') - } - } - - self.httpModule = - {"http:":http, "https:":https}[self.proxy ? self.proxy.protocol : self.uri.protocol] - - if (!self.httpModule) throw new Error("Invalid protocol") - - if (self.pool === false) { - self.agent = false - } else { - if (self.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent = self.httpModule.globalAgent || self.getAgent(self.host, self.port) - self.agent.maxSockets = self.maxSockets - } - if (self.pool.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent = self.httpModule.globalAgent || self.getAgent(self.host, self.port) - self.agent.maxSockets = self.pool.maxSockets - } - } - - self.start = function () { - self._started = true - self.method = self.method || 'GET' - - self.req = self.httpModule.request(self, function (response) { - self.response = response - response.request = self - - if (self.httpModule === https && - self.strictSSL && - !response.client.authorized) { - var sslErr = response.client.authorizationError - self.emit('error', new Error('SSL Error: '+ sslErr)) - return - } - - if (setHost) delete self.headers.host - if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer) - - if (response.headers['set-cookie'] && (!self._disableCookies)) { - response.headers['set-cookie'].forEach(function(cookie) { - if (self.jar) { - // custom defined jar - self.jar.add(new Cookie(cookie)); - } - else { - // add to the global cookie jar if user don't define his own - cookieJar.add(new Cookie(cookie)); - } - }); - } - - if (response.statusCode >= 300 && - response.statusCode < 400 && - self.followRedirect && - self.method !== 'PUT' && - self.method !== 'POST' && - response.headers.location) { - if (self._redirectsFollowed >= self.maxRedirects) { - self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop.")) - return - } - self._redirectsFollowed += 1 - - if (!isUrl.test(response.headers.location)) { - response.headers.location = url.resolve(self.uri.href, response.headers.location) - } - self.uri = response.headers.location - self.redirects.push( { statusCode : response.statusCode, - redirectUri: response.headers.location }) - delete self.req - delete self.agent - delete self._started - if (self.headers) { - delete self.headers.host - } - request(self, self.callback) - return // Ignore the rest of the response - } else { - self._redirectsFollowed = self._redirectsFollowed || 0 - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) self.response.emit('end') - }) - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") - } else { - response.setEncoding(self.encoding) - } - } - - self.pipeDest = function (dest) { - if (dest.headers) { - dest.headers['content-type'] = response.headers['content-type'] - if (response.headers['content-length']) { - dest.headers['content-length'] = response.headers['content-length'] - } - } - if (dest.setHeader) { - for (var i in response.headers) { - dest.setHeader(i, response.headers[i]) - } - dest.statusCode = response.statusCode - } - if (self.pipefilter) self.pipefilter(response, dest) - } - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - response.on("data", function (chunk) { - self._destdata = true - self.emit("data", chunk) - }) - response.on("end", function (chunk) { - self._ended = true - self.emit("end", chunk) - }) - response.on("close", function () {self.emit("close")}) - - self.emit('response', response) - - if (self.onResponse) { - self.onResponse(null, response) - } - if (self.callback) { - var buffer = [] - var bodyLen = 0 - self.on("data", function (chunk) { - buffer.push(chunk) - bodyLen += chunk.length - }) - self.on("end", function () { - if (buffer.length && Buffer.isBuffer(buffer[0])) { - var body = new Buffer(bodyLen) - var i = 0 - buffer.forEach(function (chunk) { - chunk.copy(body, i, 0, chunk.length) - i += chunk.length - }) - response.body = body.toString() - } else if (buffer.length) { - response.body = buffer.join('') - } - - if (self.json) { - try { - response.body = JSON.parse(response.body) - } catch (e) {} - } - - self.callback(null, response, response.body) - }) - } - } - }) - - if (self.timeout) { - self.timeoutTimer = setTimeout(function() { - self.req.abort() - var e = new Error("ETIMEDOUT") - e.code = "ETIMEDOUT" - self.emit("error", e) - }, self.timeout) - } - - self.req.on('error', clientErrorHandler) - } - - self.once('pipe', function (src) { - if (self.ntick) throw new Error("You cannot pipe to this stream after the first nextTick() after creation of the request stream.") - self.src = src - if (isReadStream(src)) { - if (!self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = mimetypes.lookup(src.path.slice(src.path.lastIndexOf('.')+1)) - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.headers[i]) { - self.headers[i] = src.headers[i] - } - } - } - if (src.method && !self.method) { - self.method = src.method - } - } - - self.on('pipe', function () { - console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") - }) - }) - - process.nextTick(function () { - if (self.body) { - if (Array.isArray(self.body)) { - self.body.forEach(function(part) { - self.write(part); - }); - } else { - self.write(self.body) - } - self.end() - } else if (self.requestBodyStream) { - console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") - self.requestBodyStream.pipe(self) - } else if (!self.src) { - self.headers['content-length'] = 0 - self.end() - } - self.ntick = true - }) -} -Request.prototype.pipe = function (dest) { - if (this.response) { - if (this._destdata) { - throw new Error("You cannot pipe after data has been emitted from the response.") - } else if (this._ended) { - throw new Error("You cannot pipe after the response has been ended.") - } else { - stream.Stream.prototype.pipe.call(this, dest) - this.pipeDest(dest) - return dest - } - } else { - this.dests.push(dest) - stream.Stream.prototype.pipe.call(this, dest) - return dest - } -} -Request.prototype.write = function () { - if (!this._started) this.start() - if (!this.req) throw new Error("This request has been piped before http.request() was called.") - this.req.write.apply(this.req, arguments) -} -Request.prototype.end = function () { - if (!this._started) this.start() - if (!this.req) throw new Error("This request has been piped before http.request() was called.") - this.req.end.apply(this.req, arguments) -} -Request.prototype.pause = function () { - if (!this.response) throw new Error("This request has been piped before http.request() was called.") - this.response.pause.apply(this.response, arguments) -} -Request.prototype.resume = function () { - if (!this.response) throw new Error("This request has been piped before http.request() was called.") - this.response.resume.apply(this.response, arguments) -} - -function request (options, callback) { - if (typeof options === 'string') options = {uri:options} - if (callback) options.callback = callback - var r = new Request(options) - r.request() - return r -} - -module.exports = request - -request.defaults = function (options) { - var def = function (method) { - var d = function (opts, callback) { - if (typeof opts === 'string') opts = {uri:opts} - for (var i in options) { - if (opts[i] === undefined) opts[i] = options[i] - } - return method(opts, callback) - } - return d - } - var de = def(request) - de.get = def(request.get) - de.post = def(request.post) - de.put = def(request.put) - de.head = def(request.head) - de.del = def(request.del) - de.cookie = def(request.cookie) - de.jar = def(request.jar) - return de -} - -request.get = request -request.post = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'POST' - return request(options, callback) -} -request.put = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'PUT' - return request(options, callback) -} -request.head = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'HEAD' - if (options.body || options.requestBodyStream || options.json || options.multipart) { - throw new Error("HTTP HEAD requests MUST NOT include a request body.") - } - return request(options, callback) -} -request.del = function (options, callback) { - if (typeof options === 'string') options = {uri:options} - options.method = 'DELETE' - return request(options, callback) -} -request.jar = function () { - return new CookieJar -} -request.cookie = function (str) { - if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") - return new Cookie(str) -} diff --git a/node_modules/request/mimetypes.js b/node_modules/request/mimetypes.js deleted file mode 100644 index 8691006..0000000 --- a/node_modules/request/mimetypes.js +++ /dev/null @@ -1,146 +0,0 @@ -// from http://github.com/felixge/node-paperboy -exports.types = { - "aiff":"audio/x-aiff", - "arj":"application/x-arj-compressed", - "asf":"video/x-ms-asf", - "asx":"video/x-ms-asx", - "au":"audio/ulaw", - "avi":"video/x-msvideo", - "bcpio":"application/x-bcpio", - "ccad":"application/clariscad", - "cod":"application/vnd.rim.cod", - "com":"application/x-msdos-program", - "cpio":"application/x-cpio", - "cpt":"application/mac-compactpro", - "csh":"application/x-csh", - "css":"text/css", - "deb":"application/x-debian-package", - "dl":"video/dl", - "doc":"application/msword", - "drw":"application/drafting", - "dvi":"application/x-dvi", - "dwg":"application/acad", - "dxf":"application/dxf", - "dxr":"application/x-director", - "etx":"text/x-setext", - "ez":"application/andrew-inset", - "fli":"video/x-fli", - "flv":"video/x-flv", - "gif":"image/gif", - "gl":"video/gl", - "gtar":"application/x-gtar", - "gz":"application/x-gzip", - "hdf":"application/x-hdf", - "hqx":"application/mac-binhex40", - "html":"text/html", - "ice":"x-conference/x-cooltalk", - "ico":"image/x-icon", - "ief":"image/ief", - "igs":"model/iges", - "ips":"application/x-ipscript", - "ipx":"application/x-ipix", - "jad":"text/vnd.sun.j2me.app-descriptor", - "jar":"application/java-archive", - "jpeg":"image/jpeg", - "jpg":"image/jpeg", - "js":"text/javascript", - "json":"application/json", - "latex":"application/x-latex", - "lsp":"application/x-lisp", - "lzh":"application/octet-stream", - "m":"text/plain", - "m3u":"audio/x-mpegurl", - "man":"application/x-troff-man", - "me":"application/x-troff-me", - "midi":"audio/midi", - "mif":"application/x-mif", - "mime":"www/mime", - "movie":"video/x-sgi-movie", - "mustache":"text/plain", - "mp4":"video/mp4", - "mpg":"video/mpeg", - "mpga":"audio/mpeg", - "ms":"application/x-troff-ms", - "nc":"application/x-netcdf", - "oda":"application/oda", - "ogm":"application/ogg", - "pbm":"image/x-portable-bitmap", - "pdf":"application/pdf", - "pgm":"image/x-portable-graymap", - "pgn":"application/x-chess-pgn", - "pgp":"application/pgp", - "pm":"application/x-perl", - "png":"image/png", - "pnm":"image/x-portable-anymap", - "ppm":"image/x-portable-pixmap", - "ppz":"application/vnd.ms-powerpoint", - "pre":"application/x-freelance", - "prt":"application/pro_eng", - "ps":"application/postscript", - "qt":"video/quicktime", - "ra":"audio/x-realaudio", - "rar":"application/x-rar-compressed", - "ras":"image/x-cmu-raster", - "rgb":"image/x-rgb", - "rm":"audio/x-pn-realaudio", - "rpm":"audio/x-pn-realaudio-plugin", - "rtf":"text/rtf", - "rtx":"text/richtext", - "scm":"application/x-lotusscreencam", - "set":"application/set", - "sgml":"text/sgml", - "sh":"application/x-sh", - "shar":"application/x-shar", - "silo":"model/mesh", - "sit":"application/x-stuffit", - "skt":"application/x-koan", - "smil":"application/smil", - "snd":"audio/basic", - "sol":"application/solids", - "spl":"application/x-futuresplash", - "src":"application/x-wais-source", - "stl":"application/SLA", - "stp":"application/STEP", - "sv4cpio":"application/x-sv4cpio", - "sv4crc":"application/x-sv4crc", - "svg":"image/svg+xml", - "swf":"application/x-shockwave-flash", - "tar":"application/x-tar", - "tcl":"application/x-tcl", - "tex":"application/x-tex", - "texinfo":"application/x-texinfo", - "tgz":"application/x-tar-gz", - "tiff":"image/tiff", - "tr":"application/x-troff", - "tsi":"audio/TSP-audio", - "tsp":"application/dsptype", - "tsv":"text/tab-separated-values", - "unv":"application/i-deas", - "ustar":"application/x-ustar", - "vcd":"application/x-cdlink", - "vda":"application/vda", - "vivo":"video/vnd.vivo", - "vrm":"x-world/x-vrml", - "wav":"audio/x-wav", - "wax":"audio/x-ms-wax", - "wma":"audio/x-ms-wma", - "wmv":"video/x-ms-wmv", - "wmx":"video/x-ms-wmx", - "wrl":"model/vrml", - "wvx":"video/x-ms-wvx", - "xbm":"image/x-xbitmap", - "xlw":"application/vnd.ms-excel", - "xml":"text/xml", - "xpm":"image/x-xpixmap", - "xwd":"image/x-xwindowdump", - "xyz":"chemical/x-pdb", - "zip":"application/zip", -}; - -exports.lookup = function(ext, defaultType) { - defaultType = defaultType || 'application/octet-stream'; - - return (ext in exports.types) - ? exports.types[ext] - : defaultType; -}; \ No newline at end of file diff --git a/node_modules/request/oauth.js b/node_modules/request/oauth.js deleted file mode 100644 index 25db669..0000000 --- a/node_modules/request/oauth.js +++ /dev/null @@ -1,34 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace('!','%21') - .replace('*','%2A') - .replace('(','%28') - .replace(')','%29') - .replace("'",'%27') - ; -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret, body) { - // adapted from https://dev.twitter.com/docs/auth/oauth - var base = - httpMethod + "&" + - encodeURIComponent( base_uri ) + "&" + - Object.keys(params).sort().map(function (i) { - // big WTF here with the escape + encoding but it's what twitter wants - return escape(rfc3986(i)) + "%3D" + escape(rfc3986(params[i])) - }).join("%26") - var key = consumer_secret + '&' - if (token_secret) key += token_secret - return sha1(key, base) -} - -exports.hmacsign = hmacsign -exports.rfc3986 = rfc3986 \ No newline at end of file diff --git a/node_modules/request/package.json b/node_modules/request/package.json deleted file mode 100644 index b549f06..0000000 --- a/node_modules/request/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.2.9", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "http://github.com/mikeal/request.git" - }, - "bugs": { - "url": "http://github.com/mikeal/request/issues" - }, - "engines": [ - "node >= 0.3.6" - ], - "main": "./main", - "scripts": { - "test": "bash tests/run.sh" - }, - "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
\n  npm install request\n
\n\nOr from source:\n\n
\n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It support HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\n\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `onResponse` - If true the callback will be fired on the \"response\" event instead of \"end\". If a function it will be called on \"response\" and not effect the regular semantics of the main callback on \"end\".\n* `encoding` - Encoding to be used on response.setEncoding when buffering the response data.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", - "_id": "request@2.2.9", - "_from": "request@~2.2.9" -} diff --git a/node_modules/request/tests/googledoodle.png b/node_modules/request/tests/googledoodle.png deleted file mode 100644 index f80c9c52d3c507996535a19ee0bcfe3821de322d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38510 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 diff --git a/node_modules/request/tests/run.sh b/node_modules/request/tests/run.sh deleted file mode 100755 index 57d0f64..0000000 --- a/node_modules/request/tests/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -FAILS=0 -for i in tests/test-*.js; do - echo $i - node $i || let FAILS++ -done -exit $FAILS diff --git a/node_modules/request/tests/server.js b/node_modules/request/tests/server.js deleted file mode 100644 index bad1e50..0000000 --- a/node_modules/request/tests/server.js +++ /dev/null @@ -1,57 +0,0 @@ -var http = require('http') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - ; - -exports.createServer = function (port) { - port = port || 6767 - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'http://localhost:'+port - return s; -} - -exports.createPostStream = function (text) { - var postStream = new stream.Stream(); - postStream.writeable = true; - postStream.readable = true; - setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); - return postStream; -} -exports.createPostValidator = function (text) { - var l = function (req, resp) { - var r = ''; - req.on('data', function (chunk) {r += chunk}) - req.on('end', function () { - if (r !== text) console.log(r, text); - assert.equal(r, text) - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write('OK') - resp.end() - }) - } - return l; -} -exports.createGetResponse = function (text, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - resp.write(text) - resp.end() - } - return l; -} -exports.createChunkResponse = function (chunks, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - chunks.forEach(function (chunk) { - resp.write(chunk) - }) - resp.end() - } - return l; -} diff --git a/node_modules/request/tests/test-body.js b/node_modules/request/tests/test-body.js deleted file mode 100644 index 18ad5b9..0000000 --- a/node_modules/request/tests/test-body.js +++ /dev/null @@ -1,90 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--frontier\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--frontier\r\n\r\n' + - 'Oh hi.' + - '\r\n--frontier--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) - diff --git a/node_modules/request/tests/test-cookie.js b/node_modules/request/tests/test-cookie.js deleted file mode 100644 index aeafd10..0000000 --- a/node_modules/request/tests/test-cookie.js +++ /dev/null @@ -1,29 +0,0 @@ -var Cookie = require('../vendor/cookie') - , assert = require('assert'); - -var str = 'sid=s543qactge.wKE61E01Bs%2BKhzmxrwrnug; path=/; httpOnly; expires=Sat, 04 Dec 2010 23:27:28 GMT'; -var cookie = new Cookie(str); - -// test .toString() -assert.equal(cookie.toString(), str); - -// test .path -assert.equal(cookie.path, '/'); - -// test .httpOnly -assert.equal(cookie.httpOnly, true); - -// test .name -assert.equal(cookie.name, 'sid'); - -// test .value -assert.equal(cookie.value, 's543qactge.wKE61E01Bs%2BKhzmxrwrnug'); - -// test .expires -assert.equal(cookie.expires instanceof Date, true); - -// test .path default -var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); -assert.equal(cookie.path, '/bar'); - -console.log('All tests passed'); diff --git a/node_modules/request/tests/test-cookiejar.js b/node_modules/request/tests/test-cookiejar.js deleted file mode 100644 index 76fcd71..0000000 --- a/node_modules/request/tests/test-cookiejar.js +++ /dev/null @@ -1,90 +0,0 @@ -var Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , assert = require('assert'); - -function expires(ms) { - return new Date(Date.now() + ms).toUTCString(); -} - -// test .get() expiration -(function() { - var jar = new Jar; - var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); - jar.add(cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 0); - }, 1000); - }, 5); -})(); - -// test .get() path support -(function() { - var jar = new Jar; - var a = new Cookie('sid=1234; path=/'); - var b = new Cookie('sid=1111; path=/foo/bar'); - var c = new Cookie('sid=2222; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - - // should remove the duplicates - assert.equal(jar.cookies.length, 2); - - // same name, same path, latter prevails - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], c); - - // same name, diff path, path specifity prevails, latter prevails - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], a); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=3333; path=/foo/bar'); - var c = new Cookie('pid=3333; path=/foo/bar'); - var d = new Cookie('sid=2222; path=/foo/'); - var e = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - jar.add(d); - jar.add(e); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 2); - assert.equal(cookies[0], b); - assert.equal(cookies[1], c); - - var cookies = jar.get({ url: 'http://foo.com/foo/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], d); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], e); -})(); - -setTimeout(function() { - console.log('All tests passed'); -}, 1200); diff --git a/node_modules/request/tests/test-errors.js b/node_modules/request/tests/test-errors.js deleted file mode 100644 index a7db1f7..0000000 --- a/node_modules/request/tests/test-errors.js +++ /dev/null @@ -1,30 +0,0 @@ -var server = require('./server') - , events = require('events') - , assert = require('assert') - , request = require('../main.js') - ; - -var local = 'http://localhost:8888/asdf' - -try { - request({uri:local, body:{}}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.body.') -} - -try { - request({uri:local, multipart: 'foo'}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.multipart.') -} - -try { - request({uri:local, multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -console.log("All tests passed.") diff --git a/node_modules/request/tests/test-oauth.js b/node_modules/request/tests/test-oauth.js deleted file mode 100644 index 7d969a0..0000000 --- a/node_modules/request/tests/test-oauth.js +++ /dev/null @@ -1,109 +0,0 @@ -var hmacsign = require('../oauth').hmacsign - , assert = require('assert') - , qs = require('querystring') - , request = require('../main') - ; - -function getsignature (r) { - var sign - r.headers.authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { - if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) - }) - return decodeURIComponent(sign) -} - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - - -var r = request.post( - { url: 'https://api.twitter.com/oauth/request_token' - , oauth: - { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , timestamp: '1272323042' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - } - }) - -console.log(getsignature(r)) -assert.equal(reqsign, getsignature(r)) - -var r = request.post( - { url: 'https://api.twitter.com/oauth/access_token' - , oauth: - { consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , signature_method: 'HMAC-SHA1' - , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , timestamp: '1272323047' - , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" - } - }) - -console.log(getsignature(r)) -assert.equal(accsign, getsignature(r)) - -var r = request.post( - { url: 'http://api.twitter.com/1/statuses/update.json' - , oauth: - { consumer_key: "GDdmIQH6jhtmLUypg82g" - , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , signature_method: "HMAC-SHA1" - , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , timestamp: "1272325550" - , version: "1.0" - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" - } - , form: {status: 'setting up my twitter 私のさえずりを設定する'} - }) - -console.log(getsignature(r)) -assert.equal(upsign, getsignature(r)) - diff --git a/node_modules/request/tests/test-pipes.js b/node_modules/request/tests/test-pipes.js deleted file mode 100644 index 0774647..0000000 --- a/node_modules/request/tests/test-pipes.js +++ /dev/null @@ -1,167 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var s = server.createServer(3453); - -function ValidationStream(str) { - this.str = str - this.buf = '' - this.on('data', function (data) { - this.buf += data - }) - this.on('end', function () { - assert.equal(this.str, this.buf) - }) - this.writable = true -} -util.inherits(ValidationStream, stream.Stream) -ValidationStream.prototype.write = function (chunk) { - this.emit('data', chunk) -} -ValidationStream.prototype.end = function (chunk) { - if (chunk) emit('data', chunk) - this.emit('end') -} - -s.listen(s.port, function () { - counter = 0; - - var check = function () { - counter = counter - 1 - if (counter === 0) { - console.log('All tests passed.') - setTimeout(function () { - process.exit(); - }, 500) - } - } - - // Test pipeing to a request object - s.once('/push', server.createPostValidator("mydata")); - - var mydata = new stream.Stream(); - mydata.readable = true - - counter++ - var r1 = request.put({url:'http://localhost:3453/push'}, function () { - check(); - }) - mydata.pipe(r1) - - mydata.emit('data', 'mydata'); - mydata.emit('end'); - - - // Test pipeing from a request object. - s.once('/pull', server.createGetResponse("mypulldata")); - - var mypulldata = new stream.Stream(); - mypulldata.writable = true - - counter++ - request({url:'http://localhost:3453/pull'}).pipe(mypulldata) - - var d = ''; - - mypulldata.write = function (chunk) { - d += chunk; - } - mypulldata.end = function () { - assert.equal(d, 'mypulldata'); - check(); - }; - - - s.on('/cat', function (req, resp) { - if (req.method === "GET") { - resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); - resp.end('asdf') - } else if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/plain-test'); - assert.equal(req.headers['content-length'], 4) - var validate = ''; - - req.on('data', function (chunk) {validate += chunk}) - req.on('end', function () { - resp.writeHead(201); - resp.end(); - assert.equal(validate, 'asdf'); - check(); - }) - } - }) - s.on('/pushjs', function (req, resp) { - if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/javascript'); - check(); - } - }) - s.on('/catresp', function (req, resp) { - request.get('http://localhost:3453/cat').pipe(resp) - }) - s.on('/doodle', function (req, resp) { - if (req.headers['x-oneline-proxy']) { - resp.setHeader('x-oneline-proxy', 'yup') - } - resp.writeHead('200', {'content-type':'image/png'}) - fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) - }) - s.on('/onelineproxy', function (req, resp) { - var x = request('http://localhost:3453/doodle') - req.pipe(x) - x.pipe(resp) - }) - - counter++ - fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) - - counter++ - request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) - - counter++ - request.get('http://localhost:3453/catresp', function (e, resp, body) { - assert.equal(resp.headers['content-type'], 'text/plain-test'); - assert.equal(resp.headers['content-length'], 4) - check(); - }) - - var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) - - counter++ - request.get('http://localhost:3453/doodle').pipe(doodleWrite) - - doodleWrite.on('close', function () { - assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) - check() - }) - - process.on('exit', function () { - fs.unlinkSync(path.join(__dirname, 'test.png')) - }) - - counter++ - request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { - assert.equal(resp.headers['x-oneline-proxy'], 'yup') - check() - }) - - s.on('/afterresponse', function (req, resp) { - resp.write('d') - resp.end() - }) - - counter++ - var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { - var v = new ValidationStream('d') - afterresp.pipe(v) - v.on('end', check) - }) - -}) diff --git a/node_modules/request/tests/test-proxy.js b/node_modules/request/tests/test-proxy.js deleted file mode 100644 index 647157c..0000000 --- a/node_modules/request/tests/test-proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - proxy: 'http://localhost:'+port - /* - //should behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/node_modules/request/tests/test-timeout.js b/node_modules/request/tests/test-timeout.js deleted file mode 100644 index 673f8ad..0000000 --- a/node_modules/request/tests/test-timeout.js +++ /dev/null @@ -1,87 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); -var expectedBody = "waited"; -var remainingTests = 5; - -s.listen(s.port, function () { - // Request that waits for 200ms - s.on('/timeout', function (req, resp) { - setTimeout(function(){ - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write(expectedBody) - resp.end() - }, 200); - }); - - // Scenario that should timeout - var shouldTimeout = { - url: s.url + "/timeout", - timeout:100 - } - - - request(shouldTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - - // Scenario that shouldn't timeout - var shouldntTimeout = { - url: s.url + "/timeout", - timeout:300 - } - - request(shouldntTimeout, function (err, resp, body) { - assert.equal(err, null); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with no timeout set, so shouldn't timeout - var noTimeout = { - url: s.url + "/timeout" - } - - request(noTimeout, function (err, resp, body) { - assert.equal(err); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with a negative timeout value, should be treated a zero or the minimum delay - var negativeTimeout = { - url: s.url + "/timeout", - timeout:-1000 - } - - request(negativeTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - // Scenario with a float timeout value, should be rounded by setTimeout anyway - var floatTimeout = { - url: s.url + "/timeout", - timeout: 100.76 - } - - request(floatTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - function checkDone() { - if(--remainingTests == 0) { - s.close(); - console.log("All tests passed."); - } - } -}) - diff --git a/node_modules/request/uuid.js b/node_modules/request/uuid.js deleted file mode 100644 index 1d83bd5..0000000 --- a/node_modules/request/uuid.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function () { - var s = [], itoh = '0123456789ABCDEF'; - - // Make array of random hex digits. The UUID only has 32 digits in it, but we - // allocate an extra items to make room for the '-'s we'll be inserting. - for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10); - - // Conform to RFC-4122, section 4.4 - s[14] = 4; // Set 4 high bits of time_high field to version - s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence - - // Convert to hex chars - for (var i = 0; i <36; i++) s[i] = itoh[s[i]]; - - // Insert '-'s - s[8] = s[13] = s[18] = s[23] = '-'; - - return s.join(''); -} diff --git a/node_modules/request/vendor/cookie/index.js b/node_modules/request/vendor/cookie/index.js deleted file mode 100644 index d8f29b3..0000000 --- a/node_modules/request/vendor/cookie/index.js +++ /dev/null @@ -1,55 +0,0 @@ -/*! - * Tobi - Cookie - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url'); - -/** - * Initialize a new `Cookie` with the given cookie `str` and `req`. - * - * @param {String} str - * @param {IncomingRequest} req - * @api private - */ - -var Cookie = exports = module.exports = function Cookie(str, req) { - this.str = str; - - // First key is the name - this.name = str.substr(0, str.indexOf('=')); - - // Map the key/val pairs - str.split(/ *; */).reduce(function(obj, pair){ - pair = pair.split(/ *= */); - obj[pair[0].toLowerCase()] = pair[1] || true; - return obj; - }, this); - - // Assign value - this.value = this[this.name]; - - // Expires - this.expires = this.expires - ? new Date(this.expires) - : Infinity; - - // Default or trim path - this.path = this.path || '/'; -}; - -/** - * Return the original cookie string. - * - * @return {String} - * @api public - */ - -Cookie.prototype.toString = function(){ - return this.str; -}; diff --git a/node_modules/request/vendor/cookie/jar.js b/node_modules/request/vendor/cookie/jar.js deleted file mode 100644 index 34920e0..0000000 --- a/node_modules/request/vendor/cookie/jar.js +++ /dev/null @@ -1,72 +0,0 @@ -/*! -* Tobi - CookieJar -* Copyright(c) 2010 LearnBoost -* MIT Licensed -*/ - -/** -* Module dependencies. -*/ - -var url = require('url'); - -/** -* Initialize a new `CookieJar`. -* -* @api private -*/ - -var CookieJar = exports = module.exports = function CookieJar() { - this.cookies = []; -}; - -/** -* Add the given `cookie` to the jar. -* -* @param {Cookie} cookie -* @api private -*/ - -CookieJar.prototype.add = function(cookie){ - this.cookies = this.cookies.filter(function(c){ - // Avoid duplication (same path, same name) - return !(c.name == cookie.name && c.path == cookie.path); - }); - this.cookies.push(cookie); -}; - -/** -* Get cookies for the given `req`. -* -* @param {IncomingRequest} req -* @return {Array} -* @api private -*/ - -CookieJar.prototype.get = function(req){ - var path = url.parse(req.url).pathname - , now = new Date - , specificity = {}; - return this.cookies.filter(function(cookie){ - if (0 == path.indexOf(cookie.path) && now < cookie.expires - && cookie.path.length > (specificity[cookie.name] || 0)) - return specificity[cookie.name] = cookie.path.length; - }); -}; - -/** -* Return Cookie string for the given `req`. -* -* @param {IncomingRequest} req -* @return {String} -* @api private -*/ - -CookieJar.prototype.cookieString = function(req){ - var cookies = this.get(req); - if (cookies.length) { - return cookies.map(function(cookie){ - return cookie.name + '=' + cookie.value; - }).join('; '); - } -}; diff --git a/node_modules/vows/.npmignore b/node_modules/vows/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/vows/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/vows/.travis.yml b/node_modules/vows/.travis.yml deleted file mode 100644 index aa1dc39..0000000 --- a/node_modules/vows/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js - -node_js: - - 0.4 - - 0.6 - diff --git a/node_modules/vows/LICENSE b/node_modules/vows/LICENSE deleted file mode 100644 index a1edd93..0000000 --- a/node_modules/vows/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2009 cloudhead - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vows/Makefile b/node_modules/vows/Makefile deleted file mode 100644 index 6bf8991..0000000 --- a/node_modules/vows/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# Run all tests -# -test: - @@bin/vows test/* - -.PHONY: test install diff --git a/node_modules/vows/README.md b/node_modules/vows/README.md deleted file mode 100644 index bfa410e..0000000 --- a/node_modules/vows/README.md +++ /dev/null @@ -1,65 +0,0 @@ -Vows -==== - -> Asynchronous BDD & continuous integration for node.js - -#### # - -introduction ------------- -There are two reasons why we might want asynchronous testing. The first, and obvious reason is that node.js is asynchronous, and therefore our tests need to be. The second reason is to make test suites which target I/O libraries run much faster. - -_Vows_ is an experiment in making this possible, while adding a minimum of overhead. - -synopsis --------- - - var vows = require('vows'), - assert = require('assert'); - - vows.describe('Deep Thought').addBatch({ - 'An instance of DeepThought': { - topic: new DeepThought, - - 'should know the answer to the ultimate question of life': function (deepThought) { - assert.equal (deepThought.question('what is the answer to the universe?'), 42); - } - } - }); - -coverage reporting ------------------- -Code coverage reporting is available if _instrumented_ code is detected. Currently only _instrumentation_ via [node-jscoverage](https://github.com/visionmedia/node-jscoverage) is supported. When _instrumented_ code is detected and coverage reporting is enabled using any of the `--cover-plain`, `--cover-html`, or `--cover-json` options a code coverage map is generated. - -### downloading and installing [node-jscoverage](https://github.com/visionmedia/node-jscoverage) -[node-jscoverage](https://github.com/visionmedia/node-jscoverage) is a binary package that needs to be compiled from source: - - $ git clone https://github.com/visionmedia/node-jscoverage.git - $ cd node-jscoverage/ - $ ./configure - checking for a BSD-compatible install... /usr/bin/install -c - checking whether build environment is sane... yes - [...] - $ make && sudo make install - -### instrumenting with jscoverage - - $ jscoverage myfile.js myfile-instrumented.js - -installation ------------- - - $ npm install vows - -documentation -------------- - -Head over to - -authors -------- - -Alexis Sellier <>, Charlie Robbins, - -*...and many others* - diff --git a/node_modules/vows/bin/vows b/node_modules/vows/bin/vows deleted file mode 100755 index 2694549..0000000 --- a/node_modules/vows/bin/vows +++ /dev/null @@ -1,579 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'), - fs = require('fs'), - util = require('util'), - events = require('events'); - -// -// Attempt to load Coffee-Script. If it's not available, continue on our -// merry way, if it is available, start searching for `*.coffee` scripts too. -// -var fileExt, specFileExt; - -try { - var coffee = require('coffee-script'); - fileExt = /\.(js|coffee)$/; - specFileExt = /[.(-|_)]((t|T)est|(s|S)pec)\.(js|coffee)$/; -} catch (_) { - fileExt = /\.js$/; - specFileExt = /[.(-|_)]((t|T)est|(s|S)pec)\.js$/; -} - -var inspect = require('eyes').inspector({ - stream: null, - styles: { string: 'grey', regexp: 'grey' } -}); - -var vows = require('../lib/vows'); -var cutils = require('../lib/vows/console'); -var stylize = require('../lib/vows/console').stylize; -var _reporter = require('../lib/vows/reporters/dot-matrix'), reporter = { - name: _reporter.name -}; -var _coverage; - -var nodeMinorVersion = parseInt(process.version.split('.')[1], 10); - -var help = [ - "usage: vows [FILE, ...] [options]", - "", - "options:", - " -v, --verbose Enable verbose output", - " -w, --watch Watch mode", - " -s, --silent Don't report", - " -i, --isolate Run each test in it's own vows process", - " -m PATTERN Only run tests matching the PATTERN string", - " -r PATTERN Only run tests matching the PATTERN regexp", - " --json Use JSON reporter", - " --spec Use Spec reporter", - " --tap Use TAP reporter", - " --dot-matrix Use Dot-Matrix reporter", - " --xunit Use xUnit reporter", - " --cover-plain Print plain coverage map if detected", - " --cover-html Write coverage map to \"coverage.html\"", - " --cover-json Write unified coverage map to \"coverage.json\"", - " --cover-xml Write coverage map to \"coverage.xml\" in Emma xml", - " --no-color Don't use terminal colors", - " --version Show version", - " -h, --help You're staring at it" -].join('\n'); - -var options = { - reporter: reporter, - matcher: /.*/, - watch: false, - coverage: false, - isolate: false, - shuffle: false, - nocolor: !process.stdout.isTTY -}; - -var files = []; - -// Get rid of process runner -// ('node' in most cases) -var arg, args = [], argv = process.argv.slice(2); - -// Current directory index, -// and path of test folder. -var root, testFolder; - -// -// Parse command-line parameters -// -while (arg = argv.shift()) { - if (arg === __filename) { continue } - - if (arg[0] !== '-') { - args.push(arg); - } else { - arg = arg.match(/^--?(.+)/)[1]; - - if (arg[0] === 'r') { - options.matcher = new(RegExp)(argv.shift()); - } else if (arg[0] === 'm') { - options.matcher = (function (str) { // Create an escaped RegExp - var specials = '. * + ? | ( ) [ ] { } \\ ^ ? ! = : $'.split(' ').join('|\\'), - regex = new(RegExp)('(\\' + specials + ')', 'g'); - return new(RegExp)(str.replace(regex, '\\$1')); - })(argv.shift()); - } else if (arg in options) { - options[arg] = true; - } else { - switch (arg) { - case 'json': - _reporter = require('../lib/vows/reporters/json'); - break; - case 'spec': - _reporter = require('../lib/vows/reporters/spec'); - break; - case 'tap': - _reporter = require('../lib/vows/reporters/tap'); - break; - case 'dot-matrix': - _reporter = require('../lib/vows/reporters/dot-matrix'); - break; - case 'silent': - case 's': - _reporter = require('../lib/vows/reporters/silent'); - break; - case 'xunit': - _reporter = require('../lib/vows/reporters/xunit'); - break; - case 'cover-plain': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-plain'); - break; - case 'cover-html': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-html'); - break; - case 'cover-json': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-json'); - break; - case 'cover-xml': - options.coverage = true; - _coverage = require('../lib/vows/coverage/report-xml'); - break; - case 'verbose': - case 'v': - options.verbose = true; - break; - case 'watch': - case 'w': - options.watch = true; - break; - case 'supress-stdout': - options.supressStdout = true; - break; - case 'shuffle': - options.shuffle = true; - break; - case 'isolate': - case 'i': - options.isolate = true; - break; - case 'no-color': - options.nocolor = true; - break; - case 'color': - options.nocolor = false; - break; - case 'no-error': - options.error = false; - break; - case 'version': - console.log('vows ' + vows.version); - process.exit(0); - case 'help': - case 'h': - console.log(help); - process.exit(0); - break; - } - } - } -} - -if (options.nocolor) { - cutils.nocolor = true; - inspect = require('eyes').inspector({ stream: null, styles: false }); -} - -if (options.supressStdout) { - _reporter.setStream && _reporter.setStream(process.stdout); - var devNullStream = fs.createWriteStream('/dev/null'); - process.__defineGetter__('stdout', function () { - return devNullStream; - }); -} - -if (options.watch) { - options.reporter = reporter = require('../lib/vows/reporters/watch'); -} - -msg('bin', 'argv', args); -msg('bin', 'options', { reporter: options.reporter.name, matcher: options.matcher }); - -if (args.length === 0 || options.watch) { - msg('bin', 'discovering', 'folder structure'); - root = fs.readdirSync('.'); - - if (root.indexOf('test') !== -1) { - testFolder = 'test'; - } else if (root.indexOf('spec') !== -1) { - testFolder = 'spec'; - } else { - abort("runner", "couldn't find test folder"); - } - msg('bin', 'discovered', "./" + testFolder); - if (args.length === 0) { - args = paths(testFolder).filter(function (f) { - return specFileExt.test(f); - }); - - if (options.watch) { - args = args.concat(paths('lib'), paths('src')); - } - } -} - -if (! options.watch) { - reporter.report = function (data, filename) { - switch (data[0]) { - case 'subject': - case 'vow': - case 'context': - case 'error': - _reporter.report(data, filename); - break; - case 'end': - (options.verbose || _reporter.name === 'json') && - _reporter.report(data); - break; - case 'finish': - options.verbose ? - _reporter.print('\n') - : - _reporter.print(' '); - break; - } - }; - reporter.reset = function () { _reporter.reset && _reporter.reset() }; - reporter.print = _reporter.print; - - files = args.map(function (a) { - return (!a.match(/^\//)) - ? path.join(process.cwd(), a.replace(fileExt, '')) - : a.replace(fileExt, ''); - }); - - if (options.shuffle) { - var source = files.slice(0); - files.length = 0; - while (source.length) { - files.push(source.splice(Math.floor(Math.random() * source.length), 1)[0]); - } - } - - runSuites(importSuites(files), function (results) { - var status = results.errored ? 2 : (results.broken ? 1 : 0); - - !options.verbose && _reporter.print('\n'); - msg('runner', 'finish'); - _reporter.report(['finish', results], { - write: function (str) { - util.print(str.replace(/^\n\n/, '\n')); - } - }); - try { - if (options.coverage === true && _$jscoverage !== undefined) { - _coverage.report(_$jscoverage); - } - } catch (err) { - // ignore the undefined jscoverage - } - if (process.stdout.write('')) { // Check if stdout is drained - process.exit(status); - } else { - process.stdout.on('drain', function () { - process.exit(status); - }); - } - }); -} else { - // - // Watch mode - // - (function () { - var pendulum = [ - '. ', '.. ', '... ', ' ...', - ' ..', ' .', ' .', ' ..', - '... ', '.. ', '. ' - ]; - var strobe = ['.', ' ']; - var status, - cue, - current = 0, - running = 0, - lastRun, - colors = ['32m', '33m', '31m'], - timer = setInterval(tick, 100); - process.on('uncaughtException', exception); - process.on('exit', cleanup); - process.on('SIGINT', function () { - process.exit(0); - }); - process.on('SIGQUIT', function () { - changed(); - }); - - cursorHide(); - - // Run every 100ms - function tick() { - if (running && (cue !== strobe)) { - cue = strobe, current = 0; - } else if (!running && (cue !== pendulum)) { - cue = pendulum, current = 0; - } - - eraseLine(); - lastRun && !running && esc(colors[status.errored ? 2 : (status.broken ? 1 : 0)]); - print(cue[current]); - - if (current == cue.length - 1) { current = -1 } - - current ++; - esc('39m'); - cursorRestore(); - } - - // - // Utility functions - // - function print(str) { util.print(str) } - function esc(str) { print("\x1b[" + str) } - function eraseLine() { esc("0K") } - function cursorRestore() { esc("0G") } - function cursorHide() { esc("?25l") } - function cursorShow() { esc("?25h") } - function cleanup() { eraseLine(), cursorShow(), clearInterval(timer), print('\n') } - function exception(err) { print(err.stack || err.message || JSON.stringify(err)), running = 0} - - // - // Get a matching test for a given file - // - function getMatchingTest(file, join) { - join || (join = '-'); - var testFile; - if (specFileExt.test(file)) { - testFile = path.join(testFolder, file); - } - else { - var root, extension; - _s = file.split('.'), root = _s[0], extension = _s[1]; - testFile = path.join(testFolder, root + join + testFolder + "." + extension); - } - - try { - fs.statSync(testFile); - } catch (e) { - if (join == '-') { - return getMatchingTest(file, '_'); - } - else { - msg('watcher', 'no equivalence found, running all tests.'); - testFile = null; - } - } - return testFile; - } - - // - // Called when a file has been modified. - // Run the matching tests and change the status. - // - function changed(file) { - status = { honored: 0, broken: 0, errored: 0, pending: 0 }; - - msg('watcher', 'detected change in', file); - - file = getMatchingTest(file); - - var files = (specFileExt.test(file) ? [file] : paths(testFolder)).map(function (p) { - return path.join(process.cwd(), p); - }).filter(function (p) { - return specFileExt.test(p); - }).map(function (p) { - var cache = require.main.moduleCache || require.cache; - if (cache[p]) { delete(cache[p]) } - return p; - }).map(function (p) { - return p.replace(fileExt, ''); - }); - - running ++; - - runSuites(importSuites(files), function (results) { - delete(results.time); - print(cutils.result(results).join('') + '\n\n'); - lastRun = new(Date); - status = results; - running --; - }); - } - - msg('watcher', 'watching', args); - - // - // Watch all relevant files, - // and call `changed()` on change. - // - args.forEach(function (p) { - fs.watchFile(p, function (current, previous) { - if (new(Date)(current.mtime).valueOf() === - new(Date)(previous.mtime).valueOf()) { return } - else { - changed(p); - } - }); - }); - })(); -} - -function runSuites(suites, callback) { - var results = { - honored: 0, - broken: 0, - errored: 0, - pending: 0, - total: 0, - time: 0 - }; - reporter.reset(); - - (function run(suites, callback) { - var suite = suites.shift(); - if (suite) { - msg('runner', "running", suite.subject + ' ', options.watch ? false : true); - suite.run(options, function (result) { - Object.keys(result).forEach(function (k) { - results[k] += result[k]; - }); - run(suites, callback); - }); - } else { - callback(results); - } - })(suites, callback); -} - -function importSuites(files) { - msg(options.watcher ? 'watcher' : 'runner', 'loading', files); - - var spawn = require('child_process').spawn; - - function cwdname(f) { - return f.replace(process.cwd() + '/', '') + '.js'; - } - - function wrapSpawn(f) { - f = cwdname(f); - return function (options, callback) { - var args = [process.argv[1], '--json', '--supress-stdout', f], - p = spawn(process.execPath, args), - result; - - // - // AvianFlu, you broke the API! OH NOEZ. - // Anyway. - // Since node 0.7.something, semantics of child process events - // changed - `exit` event is emitted when child process exits - // and `close` event is emitted when child's streams stdio streams - // are closed. `exit` event is emitted before `close` event, and - // since we use child's stdio streams, we shouldn't rely on `exit` - // event. - // - p.on(nodeMinorVersion >= 7 ? 'close' : 'exit', function (code) { - callback( - !result ? - {errored: 1, total: 1} - : - result - ); - }); - - var buffer = []; - p.stdout.on('data', function (data) { - data = data.toString().split(/\n/g); - if (data.length == 1) { - buffer.push(data[0]); - } else { - data[0] = buffer.concat(data[0]).join(''); - buffer = [data.pop()]; - - data.forEach(function (data) { - if (data) { - data = JSON.parse(data); - if (data && data[0] === 'finish') { - result = data[1]; - } else { - reporter.report(data); - } - } - }); - } - }); - - p.stderr.pipe(process.stderr); - } - } - - return files.reduce(options.isolate ? function (suites, f) { - return suites.concat({ - run: wrapSpawn(f) - }); - } : function (suites, f) { - var obj = require(f); - return suites.concat(Object.keys(obj).map(function (s) { - obj[s]._filename = cwdname(f); - return obj[s]; - })); - }, []) -} - -// -// Recursively traverse a hierarchy, returning -// a list of all relevant .js files. -// -function paths(dir) { - var paths = []; - - try { fs.statSync(dir) } - catch (e) { return [] } - - (function traverse(dir, stack) { - stack.push(dir); - fs.readdirSync(stack.join('/')).forEach(function (file) { - // - // Skip dotfiles and `vendor` directory before `fs.stat()`ing them. - // Not doing so causes race conditions with Emacs buffer files - // (`.#filename.js`). - // - if (file[0] == '.' || file === 'vendor') { - return; - } - - var path = stack.concat([file]).join('/'), - stat = fs.statSync(path); - - if (stat.isFile() && fileExt.test(file)) { - paths.push(path); - } else if (stat.isDirectory()) { - traverse(file, stack); - } - }); - stack.pop(); - })(dir || '.', []); - - return paths; -} - -function msg(cmd, subject, str, p) { - if (options.verbose) { - util[p ? 'print' : 'puts']( stylize('vows ', 'green') - + stylize(cmd, 'bold') - + ' ' + subject + ' ' - + (str ? (typeof(str) === 'string' ? str : inspect(str)) : '') - ); - } -} - -function abort(cmd, str) { - console.log(stylize('vows ', 'red') + stylize(cmd, 'bold') + ' ' + str); - console.log(stylize('vows ', 'red') + stylize(cmd, 'bold') + ' exiting'); - process.exit(-1); -} diff --git a/node_modules/vows/lib/assert/error.js b/node_modules/vows/lib/assert/error.js deleted file mode 100644 index b8fcf57..0000000 --- a/node_modules/vows/lib/assert/error.js +++ /dev/null @@ -1,152 +0,0 @@ -/** -This software contains code adapted from Mocha -(https://github.com/visionmedia/mocha) by TJ Holowaychuk -and is used herein under the following MIT license: - -Copyright (c) 2011-2012 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -var stylize = require('../vows/console').stylize; -var inspect = require('../vows/console').inspect; -var diff = require('diff'); - -/** - * Pad the given `str` to `len`. - * - * @param {String} str - * @param {String} len - * @return {String} - * @api private - */ - -function pad(str, len) { - str = String(str); - return Array(len - str.length + 1).join(' ') + str; -} - -/** - * Color lines for `str`, using the color `name`. - * - * @param {String} name - * @param {String} str - * @return {String} - * @api private - */ - -function styleLines(str, name) { - return str.split('\n').map(function(str){ - return stylize(str, name); - }).join('\n'); -} - -/** - * Return a character diff for `err`. - * - * @param {Error} err - * @return {String} - * @api private - */ - -function errorDiff(err, type) { - return diff['diff' + type](err.actual, err.expected).map(function(str){ - if (/^(\n+)$/.test(str.value)) str.value = Array(++RegExp.$1.length).join(''); - if (str.added) return styleLines(str.value, 'green'); - if (str.removed) return styleLines(str.value, 'red'); - return str.value; - }).join(''); -} - -require('assert').AssertionError.prototype.toString = function () { - var that = this, - source; - - if (this.stack) { - source = this.stack.match(/([a-zA-Z0-9._-]+\.(?:js|coffee))(:\d+):\d+/); - } - - function parse(str) { - var actual = that.actual, - expected = that.expected, - msg, len; - - if ( - 'string' === typeof actual && - 'string' === typeof expected - ) { - len = Math.max(actual.length, expected.length); - - if (len < 20) msg = errorDiff(that, 'Chars'); - else msg = errorDiff(that, 'Words'); - - // linenos - var lines = msg.split('\n'); - if (lines.length > 4) { - var width = String(lines.length).length; - msg = lines.map(function(str, i){ - return pad(++i, width) + ' |' + ' ' + str; - }).join('\n'); - } - - // legend - msg = '\n' - + stylize('actual', 'green') - + ' ' - + stylize('expected', 'red') - + '\n\n' - + msg - + '\n'; - - // indent - msg = msg.replace(/^/gm, ' '); - - return msg; - } - - actual = inspect(actual, {showHidden: actual instanceof Error}); - - if (expected instanceof Function) { - expected = expected.name; - } - else { - expected = inspect(expected, {showHidden: actual instanceof Error}); - } - - return str.replace(/{actual}/g, actual). - replace(/{operator}/g, stylize(that.operator, 'bold')). - replace(/{expected}/g, expected); - } - - if (this.message) { - var msg = stylize(parse(this.message), 'yellow'); - if (source) { - msg += stylize(' // ' + source[1] + source[2], 'grey'); - } - return msg; - } else { - return stylize([ - this.expected, - this.operator, - this.actual - ].join(' '), 'yellow'); - } -}; - diff --git a/node_modules/vows/lib/assert/macros.js b/node_modules/vows/lib/assert/macros.js deleted file mode 100644 index 1e04e9e..0000000 --- a/node_modules/vows/lib/assert/macros.js +++ /dev/null @@ -1,222 +0,0 @@ -var assert = require('assert'), - utils = require('./utils'); - -var messages = { - 'equal' : "expected {expected},\n\tgot\t {actual} ({operator})", - 'notEqual' : "didn't expect {actual} ({operator})" -}; -messages['strictEqual'] = messages['deepEqual'] = messages['equal']; -messages['notStrictEqual'] = messages['notDeepEqual'] = messages['notEqual']; - -for (var key in messages) { - assert[key] = (function (key, callback) { - return function (actual, expected, message) { - callback(actual, expected, message || messages[key]); - }; - })(key, assert[key]); -} - -assert.epsilon = function (eps, actual, expected, message) { - if (Math.abs(actual - expected) > eps) { - assert.fail(actual, expected, message || "expected {expected} \u00B1"+ eps +", but was {actual}"); - } -}; - -assert.ok = (function (callback) { - return function (actual, message) { - callback(actual, message || "expected expression to evaluate to {expected}, but was {actual}"); - }; -})(assert.ok); - -assert.match = function (actual, expected, message) { - if (! expected.test(actual)) { - assert.fail(actual, expected, message || "expected {actual} to match {expected}", "match", assert.match); - } -}; -assert.matches = assert.match; - -assert.isTrue = function (actual, message) { - if (actual !== true) { - assert.fail(actual, true, message || "expected {expected}, got {actual}", "===", assert.isTrue); - } -}; -assert.isFalse = function (actual, message) { - if (actual !== false) { - assert.fail(actual, false, message || "expected {expected}, got {actual}", "===", assert.isFalse); - } -}; -assert.isZero = function (actual, message) { - if (actual !== 0) { - assert.fail(actual, 0, message || "expected {expected}, got {actual}", "===", assert.isZero); - } -}; -assert.isNotZero = function (actual, message) { - if (actual === 0) { - assert.fail(actual, 0, message || "expected non-zero value, got {actual}", "===", assert.isNotZero); - } -}; - -assert.greater = function (actual, expected, message) { - if (actual <= expected) { - assert.fail(actual, expected, message || "expected {actual} to be greater than {expected}", ">", assert.greater); - } -}; -assert.lesser = function (actual, expected, message) { - if (actual >= expected) { - assert.fail(actual, expected, message || "expected {actual} to be lesser than {expected}", "<", assert.lesser); - } -}; - -assert.inDelta = function (actual, expected, delta, message) { - var lower = expected - delta; - var upper = expected + delta; - if (actual < lower || actual > upper) { - assert.fail(actual, expected, message || "expected {actual} to be in within *" + delta.toString() + "* of {expected}", null, assert.inDelta); - } -}; - -// -// Inclusion -// -assert.include = function (actual, expected, message) { - if ((function (obj) { - if (isArray(obj) || isString(obj)) { - return obj.indexOf(expected) === -1; - } else if (isObject(actual)) { - return ! obj.hasOwnProperty(expected); - } - return true; - })(actual)) { - assert.fail(actual, expected, message || "expected {actual} to include {expected}", "include", assert.include); - } -}; -assert.includes = assert.include; - -assert.deepInclude = function (actual, expected, message) { - if (!isArray(actual)) { - return assert.include(actual, expected, message); - } - if (!actual.some(function (item) { return utils.deepEqual(item, expected) })) { - assert.fail(actual, expected, message || "expected {actual} to include {expected}", "include", assert.deepInclude); - } -}; -assert.deepIncludes = assert.deepInclude; - -// -// Length -// -assert.isEmpty = function (actual, message) { - if ((isObject(actual) && Object.keys(actual).length > 0) || actual.length > 0) { - assert.fail(actual, 0, message || "expected {actual} to be empty", "length", assert.isEmpty); - } -}; -assert.isNotEmpty = function (actual, message) { - if ((isObject(actual) && Object.keys(actual).length === 0) || actual.length === 0) { - assert.fail(actual, 0, message || "expected {actual} to be not empty", "length", assert.isNotEmpty); - } -}; - -assert.lengthOf = function (actual, expected, message) { - var len = isObject(actual) ? Object.keys(actual).length : actual.length; - if (len !== expected) { - assert.fail(actual, expected, message || "expected {actual} to have {expected} element(s)", "length", assert.length); - } -}; - -// -// Type -// -assert.isArray = function (actual, message) { - assertTypeOf(actual, 'array', message || "expected {actual} to be an Array", assert.isArray); -}; -assert.isObject = function (actual, message) { - assertTypeOf(actual, 'object', message || "expected {actual} to be an Object", assert.isObject); -}; -assert.isNumber = function (actual, message) { - if (isNaN(actual)) { - assert.fail(actual, 'number', message || "expected {actual} to be of type {expected}", "isNaN", assert.isNumber); - } else { - assertTypeOf(actual, 'number', message || "expected {actual} to be a Number", assert.isNumber); - } -}; -assert.isBoolean = function (actual, message) { - if (actual !== true && actual !== false) { - assert.fail(actual, 'boolean', message || "expected {actual} to be a Boolean", "===", assert.isBoolean); - } -}; -assert.isNaN = function (actual, message) { - if (actual === actual) { - assert.fail(actual, 'NaN', message || "expected {actual} to be NaN", "===", assert.isNaN); - } -}; -assert.isNull = function (actual, message) { - if (actual !== null) { - assert.fail(actual, null, message || "expected {expected}, got {actual}", "===", assert.isNull); - } -}; -assert.isNotNull = function (actual, message) { - if (actual === null) { - assert.fail(actual, null, message || "expected non-null value, got {actual}", "===", assert.isNotNull); - } -}; -assert.isUndefined = function (actual, message) { - if (actual !== undefined) { - assert.fail(actual, undefined, message || "expected {actual} to be {expected}", "===", assert.isUndefined); - } -}; -assert.isDefined = function (actual, message) { - if(actual === undefined) { - assert.fail(actual, 0, message || "expected {actual} to be defined", "===", assert.isDefined); - } -}; -assert.isString = function (actual, message) { - assertTypeOf(actual, 'string', message || "expected {actual} to be a String", assert.isString); -}; -assert.isFunction = function (actual, message) { - assertTypeOf(actual, 'function', message || "expected {actual} to be a Function", assert.isFunction); -}; -assert.typeOf = function (actual, expected, message) { - assertTypeOf(actual, expected, message, assert.typeOf); -}; -assert.instanceOf = function (actual, expected, message) { - if (! (actual instanceof expected)) { - assert.fail(actual, expected, message || "expected {actual} to be an instance of {expected}", "instanceof", assert.instanceOf); - } -}; - -// -// Utility functions -// - -function assertTypeOf(actual, expected, message, caller) { - if (typeOf(actual) !== expected) { - assert.fail(actual, expected, message || "expected {actual} to be of type {expected}", "typeOf", caller); - } -}; - -function isArray (obj) { - return Array.isArray(obj); -} - -function isString (obj) { - return typeof(obj) === 'string' || obj instanceof String; -} - -function isObject (obj) { - return typeof(obj) === 'object' && obj && !isArray(obj); -} - -// A better `typeof` -function typeOf(value) { - var s = typeof(value), - types = [Object, Array, String, RegExp, Number, Function, Boolean, Date]; - - if (s === 'object' || s === 'function') { - if (value) { - types.forEach(function (t) { - if (value instanceof t) { s = t.name.toLowerCase() } - }); - } else { s = 'null' } - } - return s; -} diff --git a/node_modules/vows/lib/assert/utils.js b/node_modules/vows/lib/assert/utils.js deleted file mode 100644 index dccd0f6..0000000 --- a/node_modules/vows/lib/assert/utils.js +++ /dev/null @@ -1,77 +0,0 @@ - -// Taken from node/lib/assert.js -exports.deepEqual = function (actual, expected) { - if (actual === expected) { - return true; - - } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { - if (actual.length != expected.length) return false; - - for (var i = 0; i < actual.length; i++) { - if (actual[i] !== expected[i]) return false; - } - return true; - - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - } else { - return objEquiv(actual, expected); - } -} - -// Taken from node/lib/assert.js -exports.notDeepEqual = function (actual, expected, message) { - if (exports.deepEqual(actual, expected)) { - fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); - } -} - -// Taken from node/lib/assert.js -function isUndefinedOrNull(value) { - return value === null || value === undefined; -} - -// Taken from node/lib/assert.js -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -// Taken from node/lib/assert.js -function objEquiv(a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - if (a.prototype !== b.prototype) return false; - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return exports.deepEqual(a, b); - } - try { - var ka = Object.keys(a), - kb = Object.keys(b), - key, i; - } catch (e) { - return false; - } - if (ka.length != kb.length) - return false; - ka.sort(); - kb.sort(); - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!exports.deepEqual(a[key], b[key])) return false; - } - return true; -} - diff --git a/node_modules/vows/lib/vows.js b/node_modules/vows/lib/vows.js deleted file mode 100644 index 82324ef..0000000 --- a/node_modules/vows/lib/vows.js +++ /dev/null @@ -1,256 +0,0 @@ -// -// Vows.js - asynchronous event-based BDD for node.js -// -// usage: -// -// var vows = require('vows'); -// -// vows.describe('Deep Thought').addBatch({ -// "An instance of DeepThought": { -// topic: new DeepThought, -// -// "should know the answer to the ultimate question of life": function (deepThought) { -// assert.equal (deepThought.question('what is the answer to the universe?'), 42); -// } -// } -// }).run(); -// -var util = require('util'), - path = require('path'), - events = require('events'), - vows = exports; - -// Options -vows.options = { - Emitter: events.EventEmitter, - reporter: require('./vows/reporters/dot-matrix'), - matcher: /.*/, - error: true // Handle "error" event -}; - -vows.__defineGetter__('reporter', function () { - return vows.options.reporter; -}); - -var stylize = require('./vows/console').stylize; -var console = vows.console = require('./vows/console'); - -vows.inspect = require('./vows/console').inspect; -vows.prepare = require('./vows/extras').prepare; -vows.tryEnd = require('./vows/suite').tryEnd; - -// -// Assertion Macros & Extensions -// -require('./assert/error'); -require('./assert/macros'); - -// -// Suite constructor -// -var Suite = require('./vows/suite').Suite; - -// -// This function gets added to events.EventEmitter.prototype, by default. -// It's essentially a wrapper around `on`, which adds all the specification -// goodness. -// -function addVow(vow) { - var batch = vow.batch, - event = vow.binding.context.event || 'success', - self = this; - - batch.total ++; - batch.vows.push(vow); - - // always set a listener on the event - this.on(event, function () { - var args = Array.prototype.slice.call(arguments); - // If the vow is a sub-event then we know it is an - // emitted event. So I don't muck with the arguments - // However the legacy behavior: - // If the callback is expecting two or more arguments, - // pass the error as the first (null) and the result after. - if (!(this.ctx && this.ctx.isEvent) && - vow.callback.length >= 2 && batch.suite.options.error) { - args.unshift(null); - } - runTest(args, this.ctx); - vows.tryEnd(batch); - }); - - if (event !== 'error') { - this.on("error", function (err) { - if (vow.callback.length >= 2 || !batch.suite.options.error) { - runTest(arguments, this.ctx); - } else { - output('errored', { type: 'promise', error: err.stack || - err.message || JSON.stringify(err) }); - } - vows.tryEnd(batch); - }); - } - - // in case an event fired before we could listen - if (this._vowsEmitedEvents && - this._vowsEmitedEvents.hasOwnProperty(event)) { - // make sure no one is messing with me - if (Array.isArray(this._vowsEmitedEvents[event])) { - // I don't think I need to optimize for one event, - // I think it is more important to make sure I check the vow n times - self._vowsEmitedEvents[event].forEach(function(args) { - runTest(args, self.ctx); - }); - } else { - // initial conditions problem - throw new Error('_vowsEmitedEvents[' + event + '] is not an Array') - } - vows.tryEnd(batch); - } - - return this; - - function runTest(args, ctx) { - if (vow.callback instanceof String) { - return output('pending'); - } - - if (vow.binding.context.isEvent && vow.binding.context.after) { - var after = vow.binding.context.after; - // only need to check order. I won't get here if the after event - // has never been emitted - if (self._vowsEmitedEventsOrder.indexOf(after) > - self._vowsEmitedEventsOrder.indexOf(event)) { - output('broken', event + ' emitted before ' + after); - return; - } - } - - // Run the test, and try to catch `AssertionError`s and other exceptions; - // increment counters accordingly. - try { - vow.callback.apply(ctx === global || !ctx ? vow.binding : ctx, args); - output('honored'); - } catch (e) { - if (e.name && e.name.match(/AssertionError/)) { - output('broken', e.toString().replace(/\`/g, '`')); - } else { - output('errored', e.stack || e.message || e); - } - } - } - - function output(status, exception) { - batch[status] ++; - vow.status = status; - - if (vow.context && batch.lastContext !== vow.context) { - batch.lastContext = vow.context; - batch.suite.report(['context', vow.context]); - } - batch.suite.report(['vow', { - title: vow.description, - context: vow.context, - status: status, - exception: exception || null - }]); - } -}; - -// -// On exit, check that all promises have been fired. -// If not, report an error message. -// -process.on('exit', function () { - var results = { honored: 0, broken: 0, errored: 0, pending: 0, total: 0 }, - failure; - - vows.suites.forEach(function (s) { - if ((s.results.total > 0) && (s.results.time === null)) { - s.reporter.print('\n\n'); - s.reporter.report(['error', { error: "Asynchronous Error", suite: s }]); - } - s.batches.forEach(function (b) { - var unFired = []; - - b.vows.forEach(function (vow) { - if (! vow.status) { - if (unFired.indexOf(vow.context) === -1) { - unFired.push(vow.context); - } - } - }); - - if (unFired.length > 0) { util.print('\n') } - - unFired.forEach(function (title) { - s.reporter.report(['error', { - error: "callback not fired", - context: title, - batch: b, - suite: s - }]); - }); - - if (b.status === 'begin') { - failure = true; - results.errored ++; - results.total ++; - } - Object.keys(results).forEach(function (k) { results[k] += b[k] }); - }); - }); - if (failure) { - util.puts(console.result(results)); - process.exit(1); - } -}); - -vows.suites = []; - -// We need the old emit function so we can hook it -// and do magic to deal with events that have fired -var oldEmit = vows.options.Emitter.prototype.emit; - -// -// Create a new test suite -// -vows.describe = function (subject) { - var suite = new(Suite)(subject); - - this.options.Emitter.prototype.addVow = addVow; - // just in case someone emit's before I get to it - this.options.Emitter.prototype.emit = function (event) { - this._vowsEmitedEvents = this._vowsEmitedEvents || {}; - this._vowsEmitedEventsOrder = this._vowsEmitedEventsOrder || []; - // slice off the event - var args = Array.prototype.slice.call(arguments, 1); - // if multiple events are fired, add or push - if (this._vowsEmitedEvents.hasOwnProperty(event)) { - this._vowsEmitedEvents[event].push(args); - } else { - this._vowsEmitedEvents[event] = [args]; - } - - // push the event onto a stack so I have an order - this._vowsEmitedEventsOrder.push(event); - return oldEmit.apply(this, arguments); - } - this.suites.push(suite); - - // - // Add any additional arguments as batches if they're present - // - if (arguments.length > 1) { - for (var i = 1, l = arguments.length; i < l; ++i) { - suite.addBatch(arguments[i]); - } - } - - return suite; -}; - - -vows.version = JSON.parse(require('fs') - .readFileSync(path.join(__dirname, '..', 'package.json'))) - .version diff --git a/node_modules/vows/lib/vows/console.js b/node_modules/vows/lib/vows/console.js deleted file mode 100644 index 900cef9..0000000 --- a/node_modules/vows/lib/vows/console.js +++ /dev/null @@ -1,140 +0,0 @@ -var eyes = require('eyes').inspector({ stream: null, styles: false }); - -// Stylize a string -this.stylize = function stylize(str, style) { - if (module.exports.nocolor) { - return str; - } - - var styles = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'cyan' : [96, 39], - 'yellow' : [33, 39], - 'green' : [32, 39], - 'red' : [31, 39], - 'grey' : [90, 39], - 'green-hi' : [92, 32], - }; - return '\033[' + styles[style][0] + 'm' + str + - '\033[' + styles[style][1] + 'm'; -}; - -var $ = this.$ = function (str) { - str = new(String)(str); - - ['bold', 'grey', 'yellow', 'red', 'green', 'white', 'cyan', 'italic'].forEach(function (style) { - Object.defineProperty(str, style, { - get: function () { - return exports.$(exports.stylize(this, style)); - } - }); - }); - return str; -}; - -this.puts = function (options) { - var stylize = exports.stylize; - options.stream || (options.stream = process.stdout); - options.tail = options.tail || ''; - - return function (args) { - args = Array.prototype.slice.call(arguments); - if (!options.raw) { - args = args.map(function (a) { - return a.replace(/`([^`]+)`/g, function (_, capture) { return stylize(capture, 'italic') }) - .replace(/\*([^*]+)\*/g, function (_, capture) { return stylize(capture, 'bold') }) - .replace(/\n/g, function (_, capture) { return ' \n ' } ); - }); - } - return options.stream.write(args.join('\n') + options.tail); - }; -}; - -this.result = function (event) { - var result = [], buffer = [], time = '', header; - var complete = event.honored + event.pending + event.errored + event.broken; - var status = (event.errored && 'errored') || (event.broken && 'broken') || - (event.honored && 'honored') || (event.pending && 'pending'); - - if (event.total === 0) { - return [$("Could not find any tests to run.").bold.red]; - } - - event.honored && result.push($(event.honored).bold + " honored"); - event.broken && result.push($(event.broken).bold + " broken"); - event.errored && result.push($(event.errored).bold + " errored"); - event.pending && result.push($(event.pending).bold + " pending"); - - if (complete < event.total) { - result.push($(event.total - complete).bold + " dropped"); - } - - result = result.join(' ∙ '); - - header = { - honored: '✓ ' + $('OK').bold.green, - broken: '✗ ' + $('Broken').bold.yellow, - errored: '✗ ' + $('Errored').bold.red, - pending: '- ' + $('Pending').bold.cyan - }[status] + ' » '; - - if (typeof(event.time) === 'number') { - time = ' (' + event.time.toFixed(3) + 's)'; - time = this.stylize(time, 'grey'); - } - buffer.push(header + result + time + '\n'); - - return buffer; -}; - -this.inspect = function inspect(val) { - if (module.exports.nocolor) { - return eyes(val); - } - - return '\033[1m' + eyes(val) + '\033[22m'; -}; - -this.error = function (obj) { - var string = '✗ ' + $('Errored ').red + '» '; - string += $(obj.error).red.bold + '\n'; - string += (obj.context ? ' in ' + $(obj.context).red + '\n': ''); - string += ' in ' + $(obj.suite.subject).red + '\n'; - string += ' in ' + $(obj.suite._filename).red; - - return string; -}; - -this.contextText = function (event) { - return ' ' + event; -}; - -this.vowText = function (event) { - var buffer = []; - - buffer.push(' ' + { - honored: ' ✓ ', - broken: ' ✗ ', - errored: ' ✗ ', - pending: ' - ' - }[event.status] + this.stylize(event.title, ({ - honored: 'green', - broken: 'yellow', - errored: 'red', - pending: 'cyan' - })[event.status])); - - if (event.status === 'broken') { - buffer.push(' » ' + event.exception); - } else if (event.status === 'errored') { - if (event.exception.type === 'promise') { - buffer.push(' » ' + this.stylize("An unexpected error was caught: " + - this.stylize(event.exception.error, 'bold'), 'red')); - } else { - buffer.push(' ' + this.stylize(event.exception, 'red')); - } - } - return buffer.join('\n'); -}; diff --git a/node_modules/vows/lib/vows/context.js b/node_modules/vows/lib/vows/context.js deleted file mode 100644 index b11d676..0000000 --- a/node_modules/vows/lib/vows/context.js +++ /dev/null @@ -1,76 +0,0 @@ - -this.Context = function (vow, ctx, env) { - var that = this; - - this.tests = vow.callback; - this.topics = (ctx.topics || []).slice(0); - this.emitter = null; - this.env = env || {}; - this.env.context = this; - - this.env.callback = function (/* arguments */) { - var ctx = this; - var args = Array.prototype.slice.call(arguments); - - var emit = (function (args) { - // - // Convert callback-style results into events. - // - if (vow.batch.suite.options.error) { - return function () { - var e = args.shift(); - that.emitter.ctx = ctx; - // We handle a special case, where the first argument is a - // boolean, in which case we treat it as a result, and not - // an error. This is useful for `path.exists` and other - // functions like it, which only pass a single boolean - // parameter instead of the more common (error, result) pair. - if (typeof(e) === 'boolean' && args.length === 0) { - that.emitter.emit.call(that.emitter, 'success', e); - } else { - if (e) { that.emitter.emit.apply(that.emitter, ['error', e].concat(args)) } - else { that.emitter.emit.apply(that.emitter, ['success'].concat(args)) } - } - }; - } else { - return function () { - that.emitter.ctx = ctx; - that.emitter.emit.apply(that.emitter, ['success'].concat(args)); - }; - } - })(args.slice(0)); - // If `this.callback` is called synchronously, - // the emitter will not have been set yet, - // so we defer the emition, that way it'll behave - // asynchronously. - if (that.emitter) { emit() } - else { process.nextTick(emit) } - }; - this.name = vow.description; - // events is an alias for on - if (this.name === 'events') { - this.name = vow.description = 'on'; - } - - // if this is a sub-event context AND it's context was an event, - // then I must enforce event order. - // this will not do a good job of handling pin-pong events - if (this.name === 'on' && ctx.isEvent) { - this.after = ctx.name; - } - - if (ctx.name === 'on') { - this.isEvent = true; - this.event = this.name; - this.after = ctx.after; - } else { - this.isEvent = false; - this.event = 'success'; - } - - this.title = [ - ctx.title || '', - vow.description || '' - ].join(/^[#.:]/.test(vow.description) ? '' : ' ').trim(); -}; - diff --git a/node_modules/vows/lib/vows/coverage/file.js b/node_modules/vows/lib/vows/coverage/file.js deleted file mode 100644 index 5bdef90..0000000 --- a/node_modules/vows/lib/vows/coverage/file.js +++ /dev/null @@ -1,29 +0,0 @@ - -exports.coverage = function (filename, data) { - var ret = { - filename: filename, - coverage: 0, - hits: 0, - misses: 0, - sloc : 0 - }; - - var source = data.source; - ret.source = source.map(function (line, num) { - num++; - - if (data[num] === 0) { - ret.misses++; - ret.sloc++; - } else if (data[num] !== undefined) { - ret.hits++; - ret.sloc++; - } - - return { line: line, coverage: (data[num] === undefined ? '' : data[num]) }; - }); - - ret.coverage = (ret.hits / ret.sloc) * 100; - - return ret; -}; \ No newline at end of file diff --git a/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html b/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html deleted file mode 100644 index 9943ff0..0000000 --- a/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html +++ /dev/null @@ -1,3 +0,0 @@ -
- - diff --git a/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html b/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html deleted file mode 100644 index bd05d31..0000000 --- a/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - Coverage - - - - -
diff --git a/node_modules/vows/lib/vows/coverage/report-html.js b/node_modules/vows/lib/vows/coverage/report-html.js deleted file mode 100644 index 930a30b..0000000 --- a/node_modules/vows/lib/vows/coverage/report-html.js +++ /dev/null @@ -1,133 +0,0 @@ -/** -This software contains code adapted from Mocha -(https://github.com/visionmedia/mocha) by TJ Holowaychuk -and is used herein under the following MIT license: - -Copyright (c) 20011-2012 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -var util = require('util'), - path = require('path'), - fs = require('fs'), - file = require('./file'); - -this.name = 'coverage-report-html'; - -function getCoverageClass( data ) { - var highCoverage= (data.coverage >= 80); - var okCoverage= (!highCoverage && data.coverage >=60); - var coverageClass= ''; - if( highCoverage ) coverageClass= 'high'; - else if( okCoverage) coverageClass= 'medium'; - else coverageClass= 'low'; - return coverageClass; -} -this.report = function (coverageMap) { - var out, head, foot, - files = [], summary = { - hits: 0, - misses: 0, - sloc: 0 - }; - - try { - out = fs.openSync("coverage.html", "w"); - head = fs.readFileSync(__dirname + "/fragments/coverage-head.html", "utf8"); - foot = fs.readFileSync(__dirname + "/fragments/coverage-foot.html", "utf8"); - } catch (error) { - util.print("Error: Unable to write to file coverage.html\n"); - return; - } - - fs.writeSync(out, head); - - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var data = file.coverage(filename, coverageMap[filename]); - data.filename = filename; - files.push(data); - summary.hits += data.hits; - summary.misses += data.misses; - summary.sloc += data.sloc; - } - } - - summary.coverage = (summary.hits / summary.sloc) * 100; - - fs.writeSync(out, '

Coverage

'); - - fs.writeSync(out, '
' + - '
' + summary.hits + - '
' + summary.misses + - '
' + summary.sloc + - '
' + summary.coverage.toFixed(0) + "%
"); - - files.forEach(function (data) { - var coverageClass = getCoverageClass(data); - fs.writeSync(out, '
'); - fs.writeSync(out, '

' + data.filename + '

\n'); - fs.writeSync(out, '
' + - '
' + data.hits + - '
' + data.misses + - '
' + data.sloc + - '
' + data.coverage.toFixed(0) + "%
"); - - fs.writeSync(out, ''); - - for (var i = 0, l = data.source.length; i < l; i++) { - var line = data.source[i], - klass = (line.coverage === 0 ? 'miss' : 'hit'); - - fs.writeSync(out, ''); - } - - fs.writeSync(out, "
LineHitsSource
' + i + - '' + line.coverage + - '' + line.line + '
\n"); - fs.writeSync(out, "
\n"); - }); - - fs.writeSync(out, foot); - fs.close(out); -}; diff --git a/node_modules/vows/lib/vows/coverage/report-json.js b/node_modules/vows/lib/vows/coverage/report-json.js deleted file mode 100644 index bcbab25..0000000 --- a/node_modules/vows/lib/vows/coverage/report-json.js +++ /dev/null @@ -1,54 +0,0 @@ -var util = require('util'), - fs = require('fs'), - file = require('./file'); - -this.name = 'coverage-report-json'; - -this.report = function (coverageMap) { - var output = { - meta: { - "generator": "vowsjs", - "generated": new Date().toString(), - "instrumentation": "node-jscoverage", - "file-version": "1.0" - }, - files: [ ], - coverage: [ ] - }; - - - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var data = file.coverage(filename, coverageMap[filename]); - - var coverage = { - file: filename, - coverage: data.coverage.toFixed(2), - hits: data.hits, - misses: data.misses, - sloc: data.sloc, - source: { } - }; - - for (var i = 0; i < data.source.length; i++) { - coverage.source[i + 1] = { - line: data.source[i].line, - coverage: data.source[i].coverage - }; - } - - output.coverage.push(coverage); - - output.files.push(filename); - } - } - - try { - out = fs.openSync("coverage.json", "w"); - fs.writeSync(out, JSON.stringify(output)); - fs.close(out); - } catch (error) { - util.print("Error: Unable to write to file coverage.json\n"); - return; - } -}; diff --git a/node_modules/vows/lib/vows/coverage/report-plain.js b/node_modules/vows/lib/vows/coverage/report-plain.js deleted file mode 100644 index 9de7005..0000000 --- a/node_modules/vows/lib/vows/coverage/report-plain.js +++ /dev/null @@ -1,38 +0,0 @@ -var util = require('util'), - file = require('./file'); - -this.name = 'coverage-report-plain'; - -function lpad(str, width) { - str = String(str); - var n = width - str.length; - - if (n < 1) { - return str; - } - - while (n--) { - str = ' ' + str; - } - - return str; -} - - -this.report = function (coverageMap) { - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var data = file.coverage(filename, coverageMap[filename]); - - util.print(filename + ":\n"); - util.print("[ hits: " + data.hits + ", misses: " + data.misses); - util.print(", sloc: " + data.sloc + ", coverage: " + data.coverage.toFixed(2) + "% ]\n"); - - for (var i = 0; i < data.source.length; i++) { - util.print(lpad(data.source[i].coverage, 5) + " | " + data.source[i].line + "\n"); - } - - util.print("\n"); - } - } -}; diff --git a/node_modules/vows/lib/vows/coverage/report-xml.js b/node_modules/vows/lib/vows/coverage/report-xml.js deleted file mode 100644 index b9ff95b..0000000 --- a/node_modules/vows/lib/vows/coverage/report-xml.js +++ /dev/null @@ -1,81 +0,0 @@ -var fs = require('fs'), - file = require('./file'); - -this.name = 'coverage-report-xml'; - -this.report = function (coverageMap) { - var all = { - xml: '', - packages: 0, - files: 0, - lines: 0, - hits: 0 - }, - data = {}; - - // group data by path - for (var filename in coverageMap) { - if (coverageMap.hasOwnProperty(filename)) { - var pkg = (filename.indexOf('/') > 0) - ? filename.substr(0, filename.lastIndexOf('/')) - : filename; - if (!data[pkg]) { - data[pkg] = {}; - } - data[pkg][ (filename.indexOf('/')) - ? filename.substr(filename.lastIndexOf('/') + 1, filename.length) - : filename ] - = file.coverage(filename, coverageMap[filename]); - } - } - - // generate groups xml-fragment - for (var pkg in data) { - if (data.hasOwnProperty(pkg)) { - var pkgStat = { - xml: '', - files: 0, - lines: 0, - hits: 0 - }; - - all.xml += '\t\n'; - - for (var filename in data[pkg]) { - if (data[pkg].hasOwnProperty(filename)) { - pkgStat.files += 1; - pkgStat.lines += data[pkg][filename].sloc; - pkgStat.hits += data[pkg][filename].hits; - - pkgStat.xml += '\t\t\n' - + '\t\t\t\n' - + '\t\t\n'; - } - } - - all.packages += 1; - all.files += pkgStat.files; - all.lines += pkgStat.lines; - all.hits += pkgStat.hits; - - all.xml += '\t\t\n' - + pkgStat.xml - + '\t\n'; - } - } - - all.xml = '\n' - + '\n\n' - + '\t\n' - + '\t\n' - + '\t\n' - + '\t\n' - + '\t\n' - + '\n\n' - + '\n' - + '\t\n' - + all.xml - + '\n\n\n'; - - fs.writeFileSync('coverage.xml', all.xml); -}; diff --git a/node_modules/vows/lib/vows/extras.js b/node_modules/vows/lib/vows/extras.js deleted file mode 100644 index a90d7a5..0000000 --- a/node_modules/vows/lib/vows/extras.js +++ /dev/null @@ -1,28 +0,0 @@ -var events = require('events'); -// -// Wrap a Node.js style async function into an EventEmmitter -// -this.prepare = function (obj, targets) { - targets.forEach(function (target) { - if (target in obj) { - obj[target] = (function (fun) { - return function () { - var args = Array.prototype.slice.call(arguments); - var ee = new(events.EventEmitter); - - args.push(function (err /* [, data] */) { - var args = Array.prototype.slice.call(arguments, 1); - - if (err) { ee.emit.apply(ee, ['error', err].concat(args)) } - else { ee.emit.apply(ee, ['success'].concat(args)) } - }); - fun.apply(obj, args); - - return ee; - }; - })(obj[target]); - } - }); - return obj; -}; - diff --git a/node_modules/vows/lib/vows/reporters/dot-matrix.js b/node_modules/vows/lib/vows/reporters/dot-matrix.js deleted file mode 100644 index 0ecf590..0000000 --- a/node_modules/vows/lib/vows/reporters/dot-matrix.js +++ /dev/null @@ -1,67 +0,0 @@ -var options = { tail: '' }, - console = require('../../vows/console'), - stylize = console.stylize, - puts = console.puts(options); -// -// Console reporter -// -var messages = [], lastContext; - -this.name = 'dot-matrix'; -this.setStream = function (s) { - options.stream = s; -}; - -this.reset = function () { - messages = []; - lastContext = null; -}; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'subject': - // messages.push(stylize(event, 'underline') + '\n'); - break; - case 'context': - break; - case 'vow': - if (event.status === 'honored') { - puts(stylize('·', 'green')); - } else if (event.status === 'pending') { - puts(stylize('-', 'cyan')); - } else { - if (lastContext !== event.context) { - lastContext = event.context; - messages.push(' ' + event.context); - } - if (event.status === 'broken') { - puts(stylize('✗', 'yellow')); - messages.push(console.vowText(event)); - } else if (event.status === 'errored') { - puts(stylize('✗', 'red')); - messages.push(console.vowText(event)); - } - messages.push(''); - } - break; - case 'end': - puts(' '); - break; - case 'finish': - if (messages.length) { - puts('\n\n' + messages.join('\n')); - } else { - puts(''); - } - puts(console.result(event).join('\n')); - break; - case 'error': - puts(console.error(event)); - break; - } -}; - -this.print = function (str) { - puts(str); -}; diff --git a/node_modules/vows/lib/vows/reporters/json.js b/node_modules/vows/lib/vows/reporters/json.js deleted file mode 100644 index 20c1366..0000000 --- a/node_modules/vows/lib/vows/reporters/json.js +++ /dev/null @@ -1,33 +0,0 @@ -var options = { tail: '\n', raw: true }; -var console = require('../../vows/console'); -var puts = console.puts(options); - -// -// Console JSON reporter -// -this.name = 'json'; -this.setStream = function (s) { - options.stream = s; -}; - -function removeCircularSuite(obj, suite) { - var result = {}; - - if (typeof obj !== 'object' || obj === null) return obj; - - Object.keys(obj).forEach(function(key) { - if (obj[key] === suite) { - result[key] = {}; - } else { - result[key] = removeCircularSuite(obj[key], suite || obj.suite); - } - }); - - return result; -}; - -this.report = function (obj) { - puts(JSON.stringify(removeCircularSuite(obj))); -}; - -this.print = function (str) {}; diff --git a/node_modules/vows/lib/vows/reporters/silent.js b/node_modules/vows/lib/vows/reporters/silent.js deleted file mode 100644 index fe90a33..0000000 --- a/node_modules/vows/lib/vows/reporters/silent.js +++ /dev/null @@ -1,8 +0,0 @@ -// -// Silent reporter - "Shhh" -// -this.name = 'silent'; -this.reset = function () {}; -this.report = function () {}; -this.print = function () {}; - diff --git a/node_modules/vows/lib/vows/reporters/spec.js b/node_modules/vows/lib/vows/reporters/spec.js deleted file mode 100644 index d1c6dd8..0000000 --- a/node_modules/vows/lib/vows/reporters/spec.js +++ /dev/null @@ -1,42 +0,0 @@ -var util = require('util'); - -var options = { tail: '\n' }; -var console = require('../../vows/console'); -var stylize = console.stylize, - puts = console.puts(options); -// -// Console reporter -// - -this.name = 'spec'; -this.setStream = function (s) { - options.stream = s; -}; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'subject': - puts('\n♢ ' + stylize(event, 'bold') + '\n'); - break; - case 'context': - puts(console.contextText(event)); - break; - case 'vow': - puts(console.vowText(event)); - break; - case 'end': - util.print('\n'); - break; - case 'finish': - puts(console.result(event).join('\n')); - break; - case 'error': - puts(console.error(event)); - break; - } -}; - -this.print = function (str) { - util.print(str); -}; diff --git a/node_modules/vows/lib/vows/reporters/tap.js b/node_modules/vows/lib/vows/reporters/tap.js deleted file mode 100644 index ac5a2da..0000000 --- a/node_modules/vows/lib/vows/reporters/tap.js +++ /dev/null @@ -1,100 +0,0 @@ -var options = { - tail: "\n" -}; -var console = require("../console"); -var stylize = console.stylize; -var puts = console.puts(options); - -// -// TAP Reporter -// - -this.name = "tap"; -this.setSTream = function setStream(s) { - options.stream = s; -}; - -var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; -var TapInterface = (function() { - function TapInterface() { - this.genOutput_ = __bind(this.genOutput_, this); - this.testCount = __bind(this.testCount, this); - this.bailOut = __bind(this.bailOut, this); - this.skip = __bind(this.skip, this); - this.notOk = __bind(this.notOk, this); - this.ok = __bind(this.ok, this); - this.count_ = 0; - } - - TapInterface.prototype.ok = function(description) { - return this.genOutput_("ok", ++this.count_, "- " + description); - }; - - TapInterface.prototype.notOk = function(description) { - return this.genOutput_("not ok", ++this.count_, "- " + description); - }; - - TapInterface.prototype.skip = function(description) { - return this.genOutput_("ok", ++this.count_, "# SKIP " + description); - }; - - TapInterface.prototype.bailOut = function(reason) { - return "Bail out!" + (reason !== null ? " " + reason : ""); - }; - - TapInterface.prototype.testCount = function() { - return "1.." + this.count_; - }; - - TapInterface.prototype.genOutput_ = function(status, testNumber, description) { - return "" + status + " " + testNumber + " " + description; - }; - - return TapInterface; -})(); - -var tap = new TapInterface(); - -this.report = function report(data) { - var type = data[0]; - var event = data[1]; - switch (type) { - case "subject": - puts("# " + stylize(event, "bold")); - break; - case "context": - puts("# " + event); - break; - case "vow": - switch (event.status) { - case "honored": - puts(tap.ok(event.title)); - break; - case "pending": - puts(tap.skip(event.title)); - break; - case "broken": - puts(tap.notOk(event.title + "\n# " + event.exception)); - break; - case "errored": - puts(tap.notOk(event.title)); - puts(tap.bailOut(event.exception)); - break; - } - break; - case "end": - puts("\n"); - break; - case "finish": - puts(tap.testCount()); - break; - case "error": - puts("#> Errored"); - puts("# " + JSON.stringify(data)); - break; - } -}; - -this.print = function print(str) { - require("util").print(str); -}; diff --git a/node_modules/vows/lib/vows/reporters/watch.js b/node_modules/vows/lib/vows/reporters/watch.js deleted file mode 100644 index 58f6e3c..0000000 --- a/node_modules/vows/lib/vows/reporters/watch.js +++ /dev/null @@ -1,37 +0,0 @@ -var options = {}; -var console = require('../../vows/console'); -var spec = require('../../vows/reporters/spec'); -var stylize = console.stylize, - puts = console.puts(options); -// -// Console reporter -// -var lastContext; - -this.name = 'watch'; -this.setStream = function (s) { - options.stream = s; -}; -this.reset = function () { - lastContext = null; -}; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'vow': - if (['honored', 'pending'].indexOf(event.status) === -1) { - if (lastContext !== event.context) { - lastContext = event.context; - puts(console.contextText(event.context)); - } - puts(console.vowText(event)); - puts(''); - } - break; - case 'error': - puts(console.error(event)); - break; - } -}; -this.print = function (str) {}; diff --git a/node_modules/vows/lib/vows/reporters/xunit.js b/node_modules/vows/lib/vows/reporters/xunit.js deleted file mode 100644 index 411a948..0000000 --- a/node_modules/vows/lib/vows/reporters/xunit.js +++ /dev/null @@ -1,90 +0,0 @@ -// xunit outoput for vows, so we can run things under hudson -// -// The translation to xunit is simple. Most likely more tags/attributes can be -// added, see: http://ant.1045680.n5.nabble.com/schema-for-junit-xml-output-td1375274.html -// - -var puts = require('util').puts; - -var buffer = [], - curSubject = null; - -function xmlEnc(value) { - return !value ? value : String(value).replace(/&/g, "&") - .replace(/>/g, ">") - .replace(/'; -} - -function cdata(data) { - return ''; -} - -this.name = 'xunit'; -this.report = function (data) { - var event = data[1]; - - switch (data[0]) { - case 'subject': - curSubject = event; - break; - case 'context': - break; - case 'vow': - switch (event.status) { - case 'honored': - buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, true)); - break; - case 'broken': - var err = tag('error', {type: 'vows.event.broken', message: 'Broken test'}, false, cdata(event.exception)); - buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, false, err)); - break; - case 'errored': - var skip = tag('skipped', {type: 'vows.event.errored', message: 'Errored test'}, false, cdata(event.exception)); - buffer.push(tag('testcase', {classname: curSubject, name: event.context + ': ' + event.title}, false, skip)); - break; - case 'pending': - // nop - break; - } - break; - case 'end': - buffer.push(end('testcase')); - break; - case 'finish': - buffer.unshift(tag('testsuite', {name: 'Vows test', tests: event.total, timestamp: (new Date()).toUTCString(), errors: event.errored, failures: event.broken, skip: event.pending, time: event.time})); - buffer.push(end('testsuite')); - puts(buffer.join('\n')); - break; - case 'error': - break; - } -}; - -this.print = function (str) { }; diff --git a/node_modules/vows/lib/vows/suite.js b/node_modules/vows/lib/vows/suite.js deleted file mode 100644 index e2c2423..0000000 --- a/node_modules/vows/lib/vows/suite.js +++ /dev/null @@ -1,386 +0,0 @@ -var events = require('events'), - path = require('path'); - -var vows = require('../vows'); -var Context = require('../vows/context').Context; - -this.Suite = function (subject) { - this.subject = subject; - this.matcher = /.*/; - this.reporter = require('./reporters/dot-matrix'); - this.batches = []; - this.options = { error: true }; - this.reset(); -}; - -this.Suite.prototype = new(function () { - this.reset = function () { - this.results = { - honored: 0, - broken: 0, - errored: 0, - pending: 0, - total: 0, - time: null - }; - this.batches.forEach(function (b) { - b.lastContext = null; - b.remaining = b._remaining; - b.honored = b.broken = b.errored = b.total = b.pending = 0; - b.vows.forEach(function (vow) { vow.status = null }); - b.teardowns = []; - }); - }; - - this.addBatch = function (tests) { - this.batches.push({ - tests: tests, - suite: this, - vows: [], - remaining: 0, - _remaining: 0, - honored: 0, - broken: 0, - errored: 0, - pending: 0, - total: 0, - teardowns: [] - }); - return this; - }; - this.addVows = this.addBatch; - - this.parseBatch = function (batch, matcher) { - var tests = batch.tests; - - if ('topic' in tests) { - throw new(Error)("missing top-level context."); - } - // Count the number of vows/promises expected to fire, - // so we know when the tests are over. - // We match the keys against `matcher`, to decide - // whether or not they should be included in the test. - // Any key, including assertion function keys can be matched. - // If a child matches, then the n parent topics must not be skipped. - (function count(tests, _match) { - var match = false; - - var keys = Object.keys(tests).filter(function (k) { - return k !== 'topic' && k !== 'teardown'; - }); - - for (var i = 0, key; i < keys.length; i++) { - key = keys[i]; - - // If the parent node, or this one matches. - match = _match || matcher.test(key); - - if (typeof(tests[key]) === 'object') { - match = count(tests[key], match); - } else { - if (typeof(tests[key]) === 'string') { - tests[key] = new(String)(tests[key]); - } - if (! match) { - tests[key]._skip = true; - } - } - } - - // If any of the children matched, - // don't skip this node. - for (var i = 0; i < keys.length; i++) { - if (! tests[keys[i]]._skip) { match = true } - } - - if (match) { batch.remaining ++ } - else { tests._skip = true } - - return match; - })(tests, false); - - batch._remaining = batch.remaining; - }; - - this.runBatch = function (batch) { - var topic, - tests = batch.tests, - promise = batch.promise = new(events.EventEmitter); - - var that = this; - - batch.status = 'begin'; - - // The test runner, it calls itself recursively, passing the - // previous context to the inner contexts. This is so the `topic` - // functions have access to all the previous context topics in their - // arguments list. - // It is defined and invoked at the same time. - // If it encounters a `topic` function, it waits for the returned - // promise to emit (the topic), at which point it runs the functions under it, - // passing the topic as an argument. - (function run(ctx, lastTopic) { - var old = false; - topic = ctx.tests.topic; - - if (typeof(topic) === 'function') { - if (ctx.isEvent || ctx.name === 'on') { - throw new Error('Event context cannot contain a topic'); - } - - // Run the topic, passing the previous context topics - // If topic `throw`s an exception, pass it down as a value - try { - topic = topic.apply(ctx.env, ctx.topics); - } - catch (ex) { - topic = ex; - } - - if (typeof(topic) === 'undefined') { ctx._callback = true } - } - - // If this context has a topic, store it in `lastTopic`, - // if not, use the last topic, passed down by a parent - // context. - if (typeof(topic) !== 'undefined' || ctx._callback) { - lastTopic = topic; - } else { - old = true; - topic = lastTopic; - } - - // If the topic doesn't return an event emitter (such as a promise), - // we create it ourselves, and emit the value on the next tick. - if (! (topic && - topic.constructor === events.EventEmitter)) { - // If the context is a traditional vow, then a topic can ONLY - // be an EventEmitter. However if the context is a sub-event - // then the topic may be an instanceof EventEmitter - if (!ctx.isEvent || - (ctx.isEvent && !(topic instanceof events.EventEmitter))) { - - ctx.emitter = new(events.EventEmitter); - - if (! ctx._callback) { - process.nextTick(function (val) { - return function () { - ctx.emitter.emit("success", val) - }; - }(topic)); - } - // if I have a callback, push the new topic back up to - // lastTopic - if (ctx._callback) { - lastTopic = topic = ctx.emitter; - } else { - topic = ctx.emitter; - } - } - } - - topic.on(ctx.event, function (val) { - // Once the topic fires, add the return value - // to the beginning of the topics list, so it - // becomes the first argument for the next topic. - // If we're using the parent topic, no need to - // prepend it to the topics list, or we'll get - // duplicates. - if (!old || ctx.isEvent) { - Array.prototype.unshift.apply(ctx.topics, arguments) - }; - }); - if (topic.setMaxListeners) { topic.setMaxListeners(Infinity) } - // Now run the tests, or sub-contexts - Object.keys(ctx.tests).filter(function (k) { - return ctx.tests[k] && k !== 'topic' && - k !== 'teardown' && !ctx.tests[k]._skip; - }).forEach(function (item) { - // Create a new evaluation context, - // inheriting from the parent one. - var env = Object.create(ctx.env); - env.suite = that; - - // Holds the current test or context - var vow = Object.create({ - callback: ctx.tests[item], - context: ctx.title, - description: item, - binding: ctx.env, - status: null, - batch: batch - }); - - // If we encounter a function, add it to the callbacks - // of the `topic` function, so it'll get called once the - // topic fires. - // If we encounter an object literal, we recurse, sending it - // our current context. - if ((typeof(vow.callback) === 'function') || - (vow.callback instanceof String)) { - topic.addVow(vow); - } else if (typeof(vow.callback) === 'object') { - // If there's a setup stage, we have to wait for it to fire, - // before calling the inner context. - // If the event has already fired, the context is 'on' or - // there is no setup stage, just run the inner context - // synchronously. - if (topic && - ctx.name !== 'on' && - !topic._vowsEmitedEvents.hasOwnProperty(ctx.event)) { - topic.on(ctx.event, function (ctx) { - return function (val) { - return run(new(Context)(vow, ctx, env), lastTopic); - }; - }(ctx)); - } else { - run(new(Context)(vow, ctx, env), lastTopic); - } - } - }); - // Teardown - if (ctx.tests.teardown) { - batch.teardowns.push(ctx); - } - if (! ctx.tests._skip) { - batch.remaining --; - } - // Check if we're done running the tests - exports.tryEnd(batch); - // This is our initial, empty context - })(new(Context)({ callback: tests, context: null, description: null }, {})); - return promise; - }; - - this.report = function () { - return this.reporter.report.apply(this.reporter, arguments); - }; - - this.run = function (options, callback) { - var that = this, start; - - options = options || {}; - - Object.keys(options).forEach(function (k) { - that.options[k] = options[k]; - }); - - this.matcher = this.options.matcher || this.matcher; - this.reporter = this.options.reporter || this.reporter; - - this.batches.forEach(function (batch) { - that.parseBatch(batch, that.matcher); - }); - - this.reset(); - - start = new(Date); - - if (this.batches.filter(function (b) { return b.remaining > 0 }).length) { - this.report(['subject', this.subject]); - } - - return (function run(batches) { - var batch = batches.shift(); - - if (batch) { - // If the batch has no vows to run, - // go to the next one. - if (batch.remaining === 0) { - run(batches); - } else { - that.runBatch(batch).on('end', function () { - run(batches); - }); - } - } else { - that.results.time = (new(Date) - start) / 1000; - that.report(['finish', that.results]); - - if (callback) { callback(that.results) } - - if (that.results.honored + that.results.pending === that.results.total) { - return 0; - } else { - return 1; - } - } - })(this.batches.slice(0)); - }; - - this.runParallel = function () {}; - - this.export = function (module, options) { - var that = this; - - Object.keys(options || {}).forEach(function (k) { - that.options[k] = options[k]; - }); - - if (require.main === module) { - return this.run(); - } else { - return module.exports[this.subject] = this; - } - }; - this.exportTo = function (module, options) { // Alias, for JSLint - return this.export(module, options); - }; -}); - -// -// Checks if all the tests in the batch have been run, -// and triggers the next batch (if any), by emitting the 'end' event. -// -this.tryEnd = function (batch) { - var result, style, time; - - if (batch.honored + batch.broken + batch.errored + batch.pending === batch.total && - batch.remaining === 0) { - - Object.keys(batch).forEach(function (k) { - (k in batch.suite.results) && (batch.suite.results[k] += batch[k]); - }); - - if (batch.teardowns) { - for (var i = batch.teardowns.length - 1, ctx; i >= 0; i--) { - runTeardown(batch.teardowns[i]); - } - - maybeFinish(); - } - - function runTeardown(teardown) { - var env = Object.create(teardown.env); - - Object.defineProperty(env, "callback", { - get: function () { - teardown.awaitingCallback = true; - - return function () { - teardown.awaitingCallback = false; - maybeFinish(); - }; - } - }); - - teardown.tests.teardown.apply(env, teardown.topics); - } - - function maybeFinish() { - var pending = batch.teardowns.filter(function (teardown) { - return teardown.awaitingCallback; - }); - - if (pending.length === 0) { - finish(); - } - } - - function finish() { - batch.status = 'end'; - batch.suite.report(['end']); - batch.promise.emit('end', batch.honored, batch.broken, batch.errored, batch.pending); - } - } -}; diff --git a/node_modules/vows/node_modules/diff/LICENSE b/node_modules/vows/node_modules/diff/LICENSE deleted file mode 100644 index c135dcf..0000000 --- a/node_modules/vows/node_modules/diff/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Software License Agreement (BSD License) - -Copyright (c) 2009-2011, Kevin Decker - -All rights reserved. - -Redistribution and use of this software in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of Kevin Decker nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/node_modules/vows/node_modules/diff/README.md b/node_modules/vows/node_modules/diff/README.md deleted file mode 100644 index 2ed7ee1..0000000 --- a/node_modules/vows/node_modules/diff/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# jsdiff - -A javascript text differencing implementation. - -Based on the algorithm proposed in -["An O(ND) Difference Algorithm and its Variations" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927). - -## Installation - - npm install diff - -or - - git clone git://github.com/kpdecker/jsdiff.git - -## API - -* JsDiff.diffChars(oldStr, newStr) - Diffs two blocks of text, comparing character by character. - - Returns a list of change objects (See below). - -* JsDiff.diffWords(oldStr, newStr) - Diffs two blocks of text, comparing word by word. - - Returns a list of change objects (See below). - -* JsDiff.diffLines(oldStr, newStr) - Diffs two blocks of text, comparing line by line. - - Returns a list of change objects (See below). - -* JsDiff.diffCss(oldStr, newStr) - Diffs two blocks of text, comparing CSS tokens. - - Returns a list of change objects (See below). - -* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader) - Creates a unified diff patch. - - Parameters: - * fileName : String to be output in the filename sections of the patch - * oldStr : Original string value - * newStr : New string value - * oldHeader : Additional information to include in the old file header - * newHeader : Additional information to include in thew new file header - -* convertChangesToXML(changes) - Converts a list of changes to a serialized XML format - -### Change Objects -Many of the methods above return change objects. These objects are consist of the following fields: - -* value: Text content -* added: True if the value was inserted into the new string -* removed: True of the value was removed from the old string - -Note that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner. - -## [Example](http://kpdecker.github.com/jsdiff) - -## License - -Software License Agreement (BSD License) - -Copyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com - -All rights reserved. - -Redistribution and use of this software in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of Kevin Decker nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/vows/node_modules/diff/diff.js b/node_modules/vows/node_modules/diff/diff.js deleted file mode 100644 index 8e6a1c0..0000000 --- a/node_modules/vows/node_modules/diff/diff.js +++ /dev/null @@ -1,296 +0,0 @@ -/* See license.txt for terms of usage */ - -/* - * Text diff implementation. - * - * This library supports the following APIS: - * JsDiff.diffChars: Character by character diff - * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace - * JsDiff.diffLines: Line based diff - * - * JsDiff.diffCss: Diff targeted at CSS content - * - * These methods are based on the implementation proposed in - * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). - * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - */ -var JsDiff = (function() { - function clonePath(path) { - return { newPos: path.newPos, components: path.components.slice(0) }; - } - function removeEmpty(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - if (array[i]) { - ret.push(array[i]); - } - } - return ret; - } - function escapeHTML(s) { - var n = s; - n = n.replace(/&/g, "&"); - n = n.replace(//g, ">"); - n = n.replace(/"/g, """); - - return n; - } - - - var fbDiff = function(ignoreWhitespace) { - this.ignoreWhitespace = ignoreWhitespace; - }; - fbDiff.prototype = { - diff: function(oldString, newString) { - // Handle the identity case (this is due to unrolling editLength == 0 - if (newString == oldString) { - return [{ value: newString }]; - } - if (!newString) { - return [{ value: oldString, removed: true }]; - } - if (!oldString) { - return [{ value: newString, added: true }]; - } - - newString = this.tokenize(newString); - oldString = this.tokenize(oldString); - - var newLen = newString.length, oldLen = oldString.length; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; - - // Seed editLength = 0 - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { - return bestPath[0].components; - } - - for (var editLength = 1; editLength <= maxEditLength; editLength++) { - for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { - var basePath; - var addPath = bestPath[diagonalPath-1], - removePath = bestPath[diagonalPath+1]; - oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath-1] = undefined; - } - - var canAdd = addPath && addPath.newPos+1 < newLen; - var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; - if (!canAdd && !canRemove) { - bestPath[diagonalPath] = undefined; - continue; - } - - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { - basePath = clonePath(removePath); - this.pushComponent(basePath.components, oldString[oldPos], undefined, true); - } else { - basePath = clonePath(addPath); - basePath.newPos++; - this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); - } - - var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); - - if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { - return basePath.components; - } else { - bestPath[diagonalPath] = basePath; - } - } - } - }, - - pushComponent: function(components, value, added, removed) { - var last = components[components.length-1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length-1] = - {value: this.join(last.value, value), added: added, removed: removed }; - } else { - components.push({value: value, added: added, removed: removed }); - } - }, - extractCommon: function(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath; - while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { - newPos++; - oldPos++; - - this.pushComponent(basePath.components, newString[newPos], undefined, undefined); - } - basePath.newPos = newPos; - return oldPos; - }, - - equals: function(left, right) { - var reWhitespace = /\S/; - if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { - return true; - } else { - return left == right; - } - }, - join: function(left, right) { - return left + right; - }, - tokenize: function(value) { - return value; - } - }; - - var CharDiff = new fbDiff(); - - var WordDiff = new fbDiff(true); - WordDiff.tokenize = function(value) { - return removeEmpty(value.split(/(\s+|\b)/)); - }; - - var CssDiff = new fbDiff(true); - CssDiff.tokenize = function(value) { - return removeEmpty(value.split(/([{}:;,]|\s+)/)); - }; - - var LineDiff = new fbDiff(); - LineDiff.tokenize = function(value) { - return value.split(/^/m); - }; - - return { - diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, - diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, - diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, - - diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, - - createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { - var ret = []; - - ret.push("Index: " + fileName); - ret.push("==================================================================="); - ret.push("--- " + fileName + (typeof oldHeader === "undefined" ? "" : "\t" + oldHeader)); - ret.push("+++ " + fileName + (typeof newHeader === "undefined" ? "" : "\t" + newHeader)); - - var diff = LineDiff.diff(oldStr, newStr); - if (!diff[diff.length-1].value) { - diff.pop(); // Remove trailing newline add - } - diff.push({value: "", lines: []}); // Append an empty value to make cleanup easier - - function contextLines(lines) { - return lines.map(function(entry) { return ' ' + entry; }); - } - function eofNL(curRange, i, current) { - var last = diff[diff.length-2], - isLast = i === diff.length-2, - isLastOfType = i === diff.length-3 && (current.added === !last.added || current.removed === !last.removed); - - // Figure out if this is the last line for the given file and missing NL - if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { - curRange.push('\\ No newline at end of file'); - } - } - - var oldRangeStart = 0, newRangeStart = 0, curRange = [], - oldLine = 1, newLine = 1; - for (var i = 0; i < diff.length; i++) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, "").split("\n"); - current.lines = lines; - - if (current.added || current.removed) { - if (!oldRangeStart) { - var prev = diff[i-1]; - oldRangeStart = oldLine; - newRangeStart = newLine; - - if (prev) { - curRange = contextLines(prev.lines.slice(-4)); - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } - curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?"+":"-") + entry; })); - eofNL(curRange, i, current); - - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= 8 && i < diff.length-2) { - // Overlapping - curRange.push.apply(curRange, contextLines(lines)); - } else { - // end the range and output - var contextSize = Math.min(lines.length, 4); - ret.push( - "@@ -" + oldRangeStart + "," + (oldLine-oldRangeStart+contextSize) - + " +" + newRangeStart + "," + (newLine-newRangeStart+contextSize) - + " @@"); - ret.push.apply(ret, curRange); - ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); - if (lines.length <= 4) { - eofNL(ret, i, current); - } - - oldRangeStart = 0; newRangeStart = 0; curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } - } - - return ret.join('\n') + '\n'; - }, - - convertChangesToXML: function(changes){ - var ret = []; - for ( var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push(""); - } else if (change.removed) { - ret.push(""); - } - - ret.push(escapeHTML(change.value)); - - if (change.added) { - ret.push(""); - } else if (change.removed) { - ret.push(""); - } - } - return ret.join(""); - }, - - convertChangesToDMP: function(changes){ - var ret = [], change; - for ( var i = 0; i < changes.length; i++) { - change = changes[i]; - ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); - } - return ret; - } - }; -})(); - -if (typeof module !== "undefined") { - module.exports = JsDiff; -} diff --git a/node_modules/vows/node_modules/diff/index.html b/node_modules/vows/node_modules/diff/index.html deleted file mode 100644 index ecb22fa..0000000 --- a/node_modules/vows/node_modules/diff/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Diff - - - - -
-

Diff

- - - -
- -github.com/kpdecker/jsdiff - - - - - - - -
restaurantaura
- - - - - diff --git a/node_modules/vows/node_modules/diff/package.json b/node_modules/vows/node_modules/diff/package.json deleted file mode 100644 index cee7139..0000000 --- a/node_modules/vows/node_modules/diff/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "diff", - "version": "1.0.3", - "description": "A javascript text diff implementation.", - "keywords": [ - "diff", - "javascript" - ], - "maintainers": [ - { - "name": "Kevin Decker", - "email": "kpdecker@gmail.com", - "url": "http://incaseofstairs.com" - } - ], - "bugs": { - "email": "kpdecker@gmail.com", - "url": "http://github.com/kpdecker/jsdiff/issues" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://github.com/kpdecker/jsdiff/blob/master/LICENSE" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/kpdecker/jsdiff.git" - }, - "engines": { - "node": ">=0.3.1" - }, - "main": "./diff", - "scripts": { - "test": "expresso test/*" - }, - "dependencies": {}, - "devDependencies": {}, - "readme": "# jsdiff\n\nA javascript text differencing implementation.\n\nBased on the algorithm proposed in\n[\"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927).\n\n## Installation\n\n npm install diff\n\nor\n\n git clone git://github.com/kpdecker/jsdiff.git\n\n## API\n\n* JsDiff.diffChars(oldStr, newStr)\n Diffs two blocks of text, comparing character by character.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffWords(oldStr, newStr)\n Diffs two blocks of text, comparing word by word.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffLines(oldStr, newStr)\n Diffs two blocks of text, comparing line by line.\n\n Returns a list of change objects (See below).\n\n* JsDiff.diffCss(oldStr, newStr)\n Diffs two blocks of text, comparing CSS tokens.\n\n Returns a list of change objects (See below).\n\n* JsDiff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader)\n Creates a unified diff patch.\n\n Parameters:\n * fileName : String to be output in the filename sections of the patch\n * oldStr : Original string value\n * newStr : New string value\n * oldHeader : Additional information to include in the old file header\n * newHeader : Additional information to include in thew new file header\n\n* convertChangesToXML(changes)\n Converts a list of changes to a serialized XML format\n\n### Change Objects\nMany of the methods above return change objects. These objects are consist of the following fields:\n\n* value: Text content\n* added: True if the value was inserted into the new string\n* removed: True of the value was removed from the old string\n\nNote that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner.\n\n## [Example](http://kpdecker.github.com/jsdiff)\n\n## License\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2011, Kevin Decker kpdecker@gmail.com\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n copyright notice, this list of conditions and the\n following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the\n following disclaimer in the documentation and/or other\n materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n contributors may be used to endorse or promote products\n derived from this software without specific prior\n written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n", - "_id": "diff@1.0.3", - "_from": "diff@~1.0.3" -} diff --git a/node_modules/vows/node_modules/diff/style.css b/node_modules/vows/node_modules/diff/style.css deleted file mode 100644 index 2047e2d..0000000 --- a/node_modules/vows/node_modules/diff/style.css +++ /dev/null @@ -1,81 +0,0 @@ -* { - margin: 0; - padding: 0; -} -html, body { - background: #EEE; - font: 12px sans-serif; -} -body { - padding-top: 1.8em; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html, body, table, tbody, tr, td { - height: 100% -} -table { - table-layout: fixed; - width: 100%; -} -td { - width: 33%; - padding: 3px 4px; - border: 1px solid transparent; - vertical-align: top; - font: 1em monospace; - text-align: left; - white-space: pre-wrap; -} -h1 { - display: inline; - font-size: 100%; -} -del { - text-decoration: none; - color: #b30000; - background: #fadad7; -} -ins { - background: #eaf2c2; - color: #406619; - text-decoration: none; -} - -#settings { - position: absolute; - top: 0; - left: 5px; - right: 5px; - height: 2em; - line-height: 2em; -} -#settings label { - margin-left: 1em; -} - -.source { - position: absolute; - right: 1%; - top: .2em; -} - -[contentEditable] { - background: #F9F9F9; - border-color: #BBB #D9D9D9 #DDD; - border-radius: 4px; - -webkit-user-modify: read-write-plaintext-only; - outline: none; -} -[contentEditable]:focus { - background: #FFF; - border-color: #6699cc; - box-shadow: 0 0 4px #2175c9; -} - -@-moz-document url-prefix() { - body { - height: 99%; /* Hide scroll bar in Firefox */ - } -} diff --git a/node_modules/vows/node_modules/diff/test/diffTest.js b/node_modules/vows/node_modules/diff/test/diffTest.js deleted file mode 100644 index 62d915d..0000000 --- a/node_modules/vows/node_modules/diff/test/diffTest.js +++ /dev/null @@ -1,625 +0,0 @@ -const VERBOSE = false; - -var assert = require('assert'), - diff = require('../diff'); - -function log() { - VERBOSE && console.log.apply(console, arguments); -} - -exports['Whitespace diff'] = function() { - diffResult = diff.diffWords("New Value", "New ValueMoreData"); - assert.equal( - "New ValueMoreDataValue", - diff.convertChangesToXML(diffResult), - "Single whitespace diffResult Value"); - - diffResult = diff.diffWords("New Value ", "New ValueMoreData "); - assert.equal( - "New ValueMoreDataValue ", - diff.convertChangesToXML(diffResult), - "Multiple whitespace diffResult Value"); -}; - -// Diff on word boundary -exports['Word Diff'] = function() { - diffResult = diff.diffWords("New :Value:Test", "New ValueMoreData "); - assert.equal( - "New ValueMoreData :Value:Test", - diff.convertChangesToXML(diffResult), - "Nonmatching word boundary diffResult Value"); - diffResult = diff.diffWords("New Value:Test", "New Value:MoreData "); - assert.equal( - "New Value:MoreData Test", - diff.convertChangesToXML(diffResult), - "Word boundary diffResult Value"); - diffResult = diff.diffWords("New Value-Test", "New Value:MoreData "); - assert.equal( - "New Value:MoreData -Test", - diff.convertChangesToXML(diffResult), - "Uninque boundary diffResult Value"); - diffResult = diff.diffWords("New Value", "New Value:MoreData "); - assert.equal( - "New Value:MoreData ", - diff.convertChangesToXML(diffResult), - "Word boundary diffResult Value"); -}; - -// Diff without changes -exports['Diff without changes'] = function() { - diffResult = diff.diffWords("New Value", "New Value"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "No changes diffResult Value"); - diffResult = diff.diffWords("New Value", "New Value"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "No changes whitespace diffResult Value"); - diffResult = diff.diffWords("", ""); - assert.equal( - "", - diff.convertChangesToXML(diffResult), - "Empty no changes diffResult Value"); -}; - -// Empty diffs -exports['Empty diffs'] = function() { - diffResult = diff.diffWords("New Value", ""); - assert.equal(1, diffResult.length, "Empty diff result length"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "Empty diffResult Value"); - diffResult = diff.diffWords("", "New Value"); - assert.equal( - "New Value", - diff.convertChangesToXML(diffResult), - "Empty diffResult Value"); -}; - -// With without anchor (the Heckel algorithm error case) -exports['No anchor'] = function() { - diffResult = diff.diffWords("New Value New Value", "Value Value New New"); - assert.eql( - "ValueNew Value New NewValue", - diff.convertChangesToXML(diffResult), - "No anchor diffResult Value"); -}; - -// CSS Diff -exports['CSS diffs'] = function() { - diffResult = diff.diffCss( - ".test,#value .test{margin-left:50px;margin-right:-40px}", - ".test2, #value2 .test {\nmargin-top:50px;\nmargin-right:-400px;\n}"); - assert.equal( - ".test2.test,#value #value2 .test {\n" - + "margin-topmargin-left:50px;\n" - + "margin-right:-400px;\n-40px}", - diff.convertChangesToXML(diffResult), - "CSS diffResult Value"); -}; - -// Line Diff -exports['Line diffs'] = function() { - diffResult = diff.diffLines( - "line\nold value\nline", - "line\nnew value\nline"); - assert.equal( - "line\nnew value\nold value\nline", - diff.convertChangesToXML(diffResult), - "Line diffResult Value"); - diffResult = diff.diffLines( - "line\nvalue\nline", - "line\nvalue\nline"); - assert.equal( - "line\nvalue\nline", - diff.convertChangesToXML(diffResult), - "Line same diffResult Value"); - diffResult = diff.diffLines( - "line\nvalue \nline", - "line\nvalue\nline"); - log("diffResult", diffResult); - log("diffResult", diff.convertChangesToXML(diffResult)); - assert.equal( - "line\nvalue\nvalue \nline", - diff.convertChangesToXML(diffResult), - "Line whitespace diffResult Value"); -}; - -// Patch creation with diff at EOF -exports['lastLineChanged'] = function() { - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,3 +1,4 @@\n' - + ' line2\n' - + ' line3\n' - + '+line4\n' - + ' line5\n', - diff.createPatch('test', 'line2\nline3\nline5\n', 'line2\nline3\nline4\nline5\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,3 +1,4 @@\n' - + ' line2\n' - + ' line3\n' - + ' line4\n' - + '+line5\n', - diff.createPatch('test', 'line2\nline3\nline4\n', 'line2\nline3\nline4\nline5\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line44\n' - + '-line4\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline44\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,5 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line44\n' - + '+line5\n' - + '-line4\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline44\nline5\n', 'header1', 'header2')); -}; - -exports['EOFNL'] = function() { - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line4\n' - + '\\ No newline at end of file\n' - + '-line4\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4\n', 'line1\nline2\nline3\nline4', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + ' line1\n' - + ' line2\n' - + ' line3\n' - + '+line4\n' - + '-line4\n' - + '\\ No newline at end of file\n', - diff.createPatch('test', 'line1\nline2\nline3\nline4', 'line1\nline2\nline3\nline4\n', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,4 +1,4 @@\n' - + '+line1\n' - + '-line11\n' - + ' line2\n' - + ' line3\n' - + ' line4\n' - + '\\ No newline at end of file\n', - diff.createPatch('test', 'line11\nline2\nline3\nline4', 'line1\nline2\nline3\nline4', 'header1', 'header2')); - - assert.eql( - 'Index: test\n' - + '===================================================================\n' - + '--- test\theader1\n' - + '+++ test\theader2\n' - + '@@ -1,5 +1,5 @@\n' - + '+line1\n' - + '-line11\n' - + ' line2\n' - + ' line3\n' - + ' line4\n' - + ' line4\n', - diff.createPatch('test', 'line11\nline2\nline3\nline4\nline4\nline4\nline4', 'line1\nline2\nline3\nline4\nline4\nline4\nline4', 'header1', 'header2')); -}; - -exports['Large Test'] = function() { - var random = 42; - var mult = 134775813, range = Math.pow(2, 32); - function nextRandom() { - random = ((random * mult) + 1) % range; - return random; - } - var largeTest = ".hbh9asgiidc {ehaahc9:ses;bhg9hc:ses;idgaag-hi9aa:cdca;ihgd9gdgca-gdadg:ighchehgaci;ggghdg:edhciag;daagsada:ahhhiaa;ahai7:hgid;}.hbh9asgiidc.hchgihaa {ggghdg:hgid;}.igiidchbh9ah {ihgd9gdgca-hbh9a:gga(" - + "hbh9ah/igiidcfhbh9ah.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7des;bhg9hc-gh97i:ses;ahai7:7des;ihgd9gdgca-edhhihdc:ses ses;}.igiidcfgde9 {ihgd9gdgca-edhhihdc:ses ses;}.bdghadaag .igiidcfgde9 {ihgd9gdgc" - + "a-edhhihdc:-7des ses;}.hchgihaa .igiidcfgde9 {ihgd9gdgca-edhhihdc:-dses ses;}.igiidcfaaaaia {ihgd9gdgca-edhhihdc:-bdes ses;}.bdghadaag .igiidcfaaaaia {ihgd9gdgca-edhhihdc:-9sses ses;}.hchgihaa .igiidc" - + "faaaaia {ihgd9gdgca-edhhihdc:-97des ses;}.igiidcfadacadha {ihgd9gdgca-edhhihdc:-9dses ses;}.bdghadaag .igiidcfadacadha {ihgd9gdgca-edhhihdc:-9bdes ses;}.hchgihaa .igiidcfadacadha {ihgd9gdgca-edhhihdc:" - + "-7sses ses;}.igiidcfabhha {ihgd9gdgca-edhhihdc:-77des ses;}.bdghadaag .igiidcfabhha {ihgd9gdgca-edhhihdc:-7dses ses;}.hchgihaa .igiidcfabhha {ihgd9gdgca-edhhihdc:-7bdes ses;}.igiidcfbdaa {ihgd9gdgca-e" - + "dhhihdc:-d7des ses;}.bdghadaag .igiidcfbdaa {ihgd9gdgca-edhhihdc:-ddses ses;}.hchgihaa .igiidcfbdaa {ihgd9gdgca-edhhihdc:-dbdes ses;}.igiidcfcaasdaaag {ihgd9gdgca-edhhihdc:-abdes ses;}.bdghadaag .igii" - + "dcfcaasdaaag {ihgd9gdgca-edhhihdc:-bsses ses;}.hchgihaa .igiidcfcaasdaaag {ihgd9gdgca-edhhihdc:-b7des ses;}.igiidcfgachba {ihgd9gdgca-edhhihdc:-dbdes ses;}.bdghadaag .igiidcfgachba {ihgd9gdgca-edhhihd" - + "c:-9ssses ses;}.hchgihaa .igiidcfgachba {ihgd9gdgca-edhhihdc:-9s7des ses;}.igiidcfghh {ihgd9gdgca-edhhihdc:-9sdses ses;}.bdghadaag .igiidcfghh {ihgd9gdgca-edhhihdc:-9sbdes ses;}.hchgihaa .igiidcfghh {" - + "ihgd9gdgca-edhhihdc:-99sses ses;}.igiidcfh7hga {ihgd9gdgca-edhhihdc:-97bdes ses;}.bdghadaag .igiidcfh7hga {ihgd9gdgca-edhhihdc:-9hsses ses;}.hchgihaa .igiidcfh7hga {ihgd9gdgca-edhhihdc:-9h7des ses;}.i" - + "giidcfgeadha {ihgd9gdgca-edhhihdc:-9hdses ses;}.bdghadaag .igiidcfgeadha {ihgd9gdgca-edhhihdc:-9hbdes ses;}.hchgihaa .igiidcfgeadha {ihgd9gdgca-edhhihdc:-9gsses ses;}.igiidcfaaisdaaag {ihgd9gdgca-edhh" - + "ihdc:-9dsses ses;}.bdghadaag .igiidcfaaisdaaag {ihgd9gdgca-edhhihdc:-9d7des ses;}.hchgihaa .igiidcfaaisdaaag {ihgd9gdgca-edhhihdc:-9ddses ses;}.igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-hsses ses;}.bdgh" - + "adaag .igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-h7des ses;}.hchgihaa .igiidcfabei9ighh7 {ihgd9gdgca-edhhihdc:-hdses ses;}.igiidcfadgd {ihgd9gdgca-edhhihdc:-hbdes ses;}.bdghadaag .igiidcfadgd {ihgd9gdgc" - + "a-edhhihdc:-gsses ses;}.hchgihaa .igiidcfadgd {ihgd9gdgca-edhhihdc:-g7des ses;}.igiidcfbhch9a {ihgd9gdgca-edhhihdc:-gdses ses;}.bdghadaag .igiidcfbhch9a {ihgd9gdgca-edhhihdc:-gbdes ses;}.hchgihaa .igi" - + "idcfbhch9a {ihgd9gdgca-edhhihdc:-dsses ses;}.igiidcfcaaahdh {ihgd9gdgca-edhhihdc:-bdses ses;}.bdghadaag .igiidcfcaaahdh {ihgd9gdgca-edhhihdc:-bbdes ses;}.hchgihaa .igiidcfcaaahdh {ihgd9gdgca-edhhihdc:" - + "-csses ses;}.igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:-97sses ses;}.bdghadaag .igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:-977des ses;}.hchgihaa .igiidcfhhaahahgg7gahgaih {ihgd9gdgca-edhhihdc:" - + "-97dses ses;}.igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-997des ses;}.bdghadaag .igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-99dses ses;}.hchgihaa .igiidcfhhaahahgg7 {ihgd9gdgca-edhhihdc:-99bdes ses;}.igiidc" - + "fcaaidddbhgd {ihgd9gdgca-edhhihdc:-asses ses;}.bdghadaag .igiidcfcaaidddbhgd {ihgd9gdgca-edhhihdc:-a7des ses;}.hchgihaa .igiidcfcaaidddbhgd {ihgd9gdgca-edhhihdc:-adses ses;}.igiidcfdeac {ihgd9gdgca-ed" - + "hhihdc:-c7des ses;}.bdghadaag .igiidcfdeac {ihgd9gdgca-edhhihdc:-cdses ses;}.hchgihaa .igiidcfdeac {ihgd9gdgca-edhhihdc:-cbdes ses;}.igiidcfdaagaghia {ihgd9gdgca-edhhihdc:-9hdses ses;}.bdghadaag .igii" - + "dcfdaagaghia {ihgd9gdgca-edhhihdc:-9hbdes ses;}.hchgihaa .igiidcfdaagaghia {ihgd9gdgca-edhhihdc:-9gsses ses;}.igiidcfahaa {ihgd9gdgca-edhhihdc:-9g7des ses;}.bdghadaag .igiidcfahaa {ihgd9gdgca-edhhihdc" - + ":-9gdses ses;}.hchgihaa .igiidcfahaa {ihgd9gdgca-edhhihdc:-9gbdes ses;}.igiidcfih9 {ihgd9gdgca-edhhihdc:-9dbdes ses;}.bdghadaag .igiidcfih9 {ihgd9gdgca-edhhihdc:-9asses ses;}.hchgihaa .igiidcfih9 {ihg" - + "d9gdgca-edhhihdc:-9a7des ses;}.igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9b7des ses;}.bdghadaag .igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9bdses ses;}.hchgihaa .igiidcfhgihgghia {ihgd9gdgca-edhhihdc:-9bbde" - + "s ses;}.igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9csses ses;}.bdghadaag .igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9c7des ses;}.hchgihaa .igiidcfhgeaggaaa {ihgd9gdgca-edhhihdc:-9cdses ses;}.igiidcfggahiaha" - + "ghah {ihgd9gdgca-edhhihdc:-9csses ses;}.bdghadaag .igiidcfggahiahaghah {ihgd9gdgca-edhhihdc:-9c7des ses;}.hchgihaa .igiidcfggahiahaghah {ihgd9gdgca-edhhihdc:-9cdses ses;}.igiidcfggahiagagdgaghia9dg9 {" - + "ihgd9gdgca-edhhihdc:-9cbdes ses;}.bdghadaag .igiidcfggahiagagdgaghia9dg9 {ihgd9gdgca-edhhihdc:-9dsses ses;}.hchgihaa .igiidcfggahiagagdgaghia9dg9 {ihgd9gdgca-edhhihdc:-9d7des ses;}.igiidcfggahiagagdga" - + "sdaaag {ihgd9gdgca-edhhihdc:-9ddses ses;}.bdghadaag .igiidcfggahiagagdgasdaaag {ihgd9gdgca-edhhihdc:-9dbdes ses;}.hchgihaa .igiidcfggahiagagdgasdaaag {ihgd9gdgca-edhhihdc:-7ssses ses;}.igiidcfggahiaga" - + "gdga {ihgd9gdgca-edhhihdc:-7s7des ses;}.bdghadaag .igiidcfggahiagagdga {ihgd9gdgca-edhhihdc:-7sdses ses;}.hchgihaa .igiidcfggahiagagdga {ihgd9gdgca-edhhihdc:-7sbdes ses;}.igiidcfggahiae79hhghagagdga {" - + "ihgd9gdgca-edhhihdc:-79bdes ses;}.bdghadaag .igiidcfggahiae79hhghagagdga {ihgd9gdgca-edhhihdc:-77sses ses;}.hchgihaa .igiidcfggahiae79hhghagagdga {ihgd9gdgca-edhhihdc:-777des ses;}.igiidcfbhdagagdga {" - + "ihgd9gdgca-edhhihdc:-77dses ses;}.bdghadaag .igiidcfbhdagagdga {ihgd9gdgca-edhhihdc:-77bdes ses;}.hchgihaa .igiidcfbhdagagdga {ihgd9gdgca-edhhihdc:-7hsses ses;}.igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-" - + "edhhihdc:-79sses ses;}.bdghadaag .igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-edhhihdc:-797des ses;}.hchgihaa .igiidcfggahiagagdgaaaghhdc {ihgd9gdgca-edhhihdc:-79dses ses;}.igiidcfgaea9abhha {ihgd9gdgca-ed" - + "hhihdc:-7h7des ses;}.bdghadaag .igiidcfgaea9abhha {ihgd9gdgca-edhhihdc:-7hdses ses;}.hchgihaa .igiidcfgaea9abhha {ihgd9gdgca-edhhihdc:-7hbdes ses;}.igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9b7des ses" - + ";}.bdghadaag .igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9bdses ses;}.hchgihaa .igiidcfsdgahgaabhha {ihgd9gdgca-edhhihdc:-9bbdes ses;}.igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7d7des ses;}.bdghadaag ." - + "igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7ddses ses;}.hchgihaa .igiidcfegiihgdabhha {ihgd9gdgca-edhhihdc:-7dbdes ses;}.igiidcfhhaa {ihgd9gdgca-edhhihdc:-7a7des ses;}.bdghadaag .igiidcfhhaa {ihgd9gdgc" - + "a-edhhihdc:-7adses ses;}.hchgihaa .igiidcfhhaa {ihgd9gdgca-edhhihdc:-7abdes ses;}.igiidcfhhaa {ihgd9gdgca-edhhihdc:-7a7des ses;}.bdghadaag .igiidcfhhaa {ihgd9gdgca-edhhihdc:-7adses ses;}.hchgihaa .igi" - + "idcfhhaa {ihgd9gdgca-edhhihdc:-7abdes ses;}.igiidcfaahi {ihgd9gdgca-edhhihdc:-h9shes ses;}.bdghadaag .igiidcfaahi {ihgd9gdgca-edhhihdc:-h97ces ses;}.hchgihaa .igiidcfaahi {ihgd9gdgca-edhhihdc:-h9dhes " - + "ses;}.igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h9bces ses;}.bdghadaag .igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h7shes ses;}.hchgihaa .igiidcfhaagdaa {ihgd9gdgca-edhhihdc:-h77ces ses;}.igiidcfcaagdcihgi {ihgd" - + "9gdgca-edhhihdc:-h7dhes ses;}.bdghadaag .igiidcfcaagdcihgi {ihgd9gdgca-edhhihdc:-h7bces ses;}.hchgihaa .igiidcfcaagdcihgi {ihgd9gdgca-edhhihdc:-hhshes ses;}.igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hh7ce" - + "s ses;}.bdghadaag .igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hhdhes ses;}.hchgihaa .igiidcfcaa9gdge {ihgd9gdgca-edhhihdc:-hhbces ses;}.igiidcf7aae {ihgd9gdgca-edhhihdc:-hgshes ses;}.bdghadaag .igiidcf7aae" - + " {ihgd9gdgca-edhhihdc:-hg7ces ses;}.igiidcfagdebacg {ihgd9gdgca-edhhihdc:-hscces ses;ahai7:9ges;}.bdghadaag .igiidcfagdebacg {ihgd9gdgca-edhhihdc:-hsbges ses;}.hchgihaa .igiidcfagdebacg {ihgd9gdgca-ed" - + "hhihdc:-hscces ses;}.igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7bbdes ses;}.bdghadaag .igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7csses ses;}.hchgihaa .igiidcfighchsaghc {ihgd9gdgca-edhhihdc:-7c7des ses;}" - + ".igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hgdhes ses;}.bdghadaag .igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hgbces ses;}.hchgihaa .igiidcfhihgiadgdsada {ihgd9gdgca-edhhihdc:-hdshes ses;}.igiidcfgas" - + "gah7 {ihgd9gdgca-edhhihdc:-hd7ces ses;}.bdghadaag .igiidcfgasgah7 {ihgd9gdgca-edhhihdc:-hddhes ses;}.hchgihaa .igiidcfgasgah7 {ihgd9gdgca-edhhihdc:-hdbces ses;}.igiidcfgadhaagdeids {ihgd9gdgca-edhhihd" - + "c:-hashes ses;}.bdghadaag .igiidcfgadhaagdeids {ihgd9gdgca-edhhihdc:-ha7ces ses;}.hchgihaa .igiidcfgadhaagdeids {ihgd9gdgca-edhhihdc:-hadhes ses;}.igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-habces ses;}" - + ".bdghadaag .igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-hbshes ses;}.hchgihaa .igiidcfdeacagdeids {ihgd9gdgca-edhhihdc:-hb7ces ses;}.igiidcfcaaagdeids {ihgd9gdgca-edhhihdc:-hbdges ses;}.bdghadaag .igiidc" - + "fcaaagdeids {ihgd9gdgca-edhhihdc:-hbbdes ses;}.hchgihaa .igiidcfcaaagdeids {ihgd9gdgca-edhhihdc:-hcsges ses;}.igiidcfighh7gahidga {ihgd9gdgca-edhhihdc:-hc7des ses;}.bdghadaag .igiidcfighh7gahidga {ihg" - + "d9gdgca-edhhihdc:-hcdges ses;}.hchgihaa .igiidcfighh7gahidga {ihgd9gdgca-edhhihdc:-hcbdes ses;}.hgdchbh9ah {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdcfhbh9ah.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:77es;ahca-7a" - + "h97i:77es;bhg9hc-gh97i:ses;ahai7:7des;ihgd9gdgca-edhhihdc:ses ses;}.hgdcfidddbhgdggggaci {ihgd9gdgca-edhhihdc:-ses ses;}.hgdcfidddbhgdggggacif7daag {ihgd9gdgca-edhhihdc:-7des ses;}.hgdcfidddbhgdggggac" - + "ifhchgihaa {ihgd9gdgca-edhhihdc:-dses ses;}.hgdcfasehca {ihgd9gdgca-edhhihdc:-bdes ses;}.hgdcfasehcaf7daag {ihgd9gdgca-edhhihdc:-9sses ses;}.hgdcfbhch9aggggaci {ihgd9gdgca-edhhihdc:-97des ses;}.hgdcfb" - + "hch9aggggacif7daag {ihgd9gdgca-edhhihdc:-9dses ses;}.hgdcfbhch9aggggacifhchgihaa {ihgd9gdgca-edhhihdc:-9bges ses;}.hgdcfgasgah7ggggaci {ihgd9gdgca-edhhihdc:-7sses ses;}.hgdcfgasgah7ggggacifhchgihaa {i" - + "hgd9gdgca-edhhihdc:-ah9es ses;}.hgdcfgasgah7ggggacif7daag {ihgd9gdgca-edhhihdc:-77des ses;}.hgdcfidddbhgdh {ahai7:7ses;ihgd9gdgca-edhhihdc:-7dses ses;}.hgdcfidddbhgdhf7daag {ahai7:7ses;ihgd9gdgca-edhh" - + "ihdc:-7bses ses;}.hgdcfge {ahai7:7ses;ihgd9gdgca-edhhihdc:-7cdes ses;}.hgdcfgef7daag {ahai7:7ses;ihgd9gdgca-edhhihdc:-hsdes ses;}.hgdcfgefhchgihaa {ahai7:7ses;ihgd9gdgca-edhhihdc:-h7des ses;}.hgdcfhah" - + "gg7 {ihgd9gdgca-edhhihdc:-hgdes ses;}.hgdcfhahgg7fhchgihaa {ihgd9gdgca-edhhihdc:-asaes ses;}.hgdcfhahgg7f7daag {ihgd9gdgca-edhhihdc:-hbges ses;}.hgdcfgdaaheha {ihgd9gdgca-edhhihdc:-gaaes ses;}.hgdcfgd" - + "aahehaf7daag {ihgd9gdgca-edhhihdc:-gd9es ses;}.hgdcfaggdg {ihgd9gdgca-edhhihdc:-g9hes ses;7ah97i:9ges;}.hgdcf7aae {ihgd9gdgca-edhhihdc:-gh9es ses;7ah97i:9ces;}.hgdcfhcsd {ihgd9gdgca-edhhihdc:-ggdes se" - + "s;7ah97i:9ges;}.hgdcfgddisdaaag {ihgd9gdgca-edhhihdc:-gades ses;7ah97i:7ses;}.hgdcfihgd {ihgd9gdgca-edhhihdc:-d9aes ses;ahai7 :7ses;}.hgdcfihgdf7daag {ihgd9gdgca-edhhihdc:-dhaes ses;ahai7 :7ses;}.hgdc" - + "fgadhafhahgg7 {ihgd9gdgca-edhhihdc:-ddaes ses;ahai7 :7des;}.hgdcfgadhafhahgg7f7daag {ihgd9gdgca-edhhihdc:-dc9es ses;ahai7:7des;}.gbhgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdchfaf.9hs);ihgd9gdgca-gaeahi:cd-" - + "gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa;ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.haghah {ihgd9gdgca-edhhihdc:-ses ses;}.gagfghia9dg9 {ihgd9gdgca-edhhihdc:-7ses ses;}.gagfsdaaag {ihgd" - + "9gdgca-edhhihdc:-gses ses;}.gagfsdaaagfhahhifsa {ihgd9gdgca-edhhihdc:-9gses ses;}.gagfsdaaagfahhedhaa {ihgd9gdgca-edhhihdc:-9ases ses;}.gagfsdaaagfsgd7ac {ihgd9gdgca-edhhihdc:-97ses ses;}.gagdgafe79hh" - + "gha {ihgd9gdgca-edhhihdc:-9sses ses;}.gagdgafabhha {ihgd9gdgca-edhhihdc:-cses ses;}.gagdga {ihgd9gdgca-edhhihdc:-ases ses;}.gagdgafhahhifsa {ihgd9gdgca-edhhihdc:-7sses ses;}.gagdgafahhedhaa {ihgd9gdgc" - + "a-edhhihdc:-77ses ses;}.gagdgafsgd7ac {ihgd9gdgca-edhhihdc:-9cses ses;}.gbhgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/hgdchfaf.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa" - + ";ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.haghah {ihgd9gdgca-edhhihdc:-ses ses;}.gagfghia9dg9 {ihgd9gdgca-edhhihdc:-7ses ses;}.gagfsdaaag {ihgd9gdgca-edhhihdc:-gses ses;}.gagfsdaaagfhahhifsa {ihgd9gdg" - + "ca-edhhihdc:-9gses ses;}.gagfsdaaagfahhedhaa {ihgd9gdgca-edhhihdc:-9ases ses;}.gagfsdaaagfsgd7ac {ihgd9gdgca-edhhihdc:-97ses ses;}.gagdgafe79hhgha {ihgd9gdgca-edhhihdc:-9sses ses;}.gagdgafabhha {ihgd9" - + "gdgca-edhhihdc:-cses ses;}.gagdga {ihgd9gdgca-edhhihdc:-ases ses;}.gagdgafhahhifsa {ihgd9gdgca-edhhihdc:-7sses ses;}.gagdgafahhedhaa {ihgd9gdgca-edhhihdc:-77ses ses;}.gagdgafsgd7ac {ihgd9gdgca-edhhihd" - + "c:-9cses ses;}.shaahgdc {ihgd9gdgca-hbh9a:gga(hbh9ah/gdcghiachihdc.9hs);ihgd9gdgca-gaeahi:cd-gaeahi;7ah97i:7ses;bhg9hc-gh97i:ses;aagihgha-hah9c:bhaaaa;ahai7:7ses;ihgd9gdgca-edhhihdc:ses ses;}.shaa{ihg" - + "d9gdgca-edhhihdc:ses ses;}.shaafhggdihi{ihgd9gdgca-edhhihdc:-7ses ses;}.shaafheeaa{ihgd9gdgca-edhhihdc:-gses ses;}.shaafheeahghihdc{ihgd9gdgca-edhhihdc:-ases ses;}.shaafhgahd{ihgd9gdgca-edhhihdc:-cses" - + " ses;}.shaafasgaa{ihgd9gdgca-edhhihdc:-9sses ses;}.shaaf7iba{ihgd9gdgca-edhhihdc:-97ses ses;}.shaafhbh9a{ihgd9gdgca-edhhihdc:-9gses ses;}.shaafghah{ihgd9gdgca-edhhihdc:-9ases ses;}.shaafghahhgghei{ihg" - + "d9gdgca-edhhihdc:-9cses ses;}.shaafbhadga{ihgd9gdgca-edhhihdc:-7sses ses;}.shaafeei{ihgd9gdgca-edhhihdc:-77ses ses;}.shaafegdgagi{ihgd9gdgca-edhhihdc:-7gses ses;}.shaaffghgdihba{ihgd9gdgca-edhhihdc:-7" - + "ases ses;}.shaafiasi{ihgd9gdgca-edhhihdc:-7cses ses;}.shaafahaad{ihgd9gdgca-edhhihdc:-hsses ses;}.ahdh{ihgd9gdgca-edhhihdc:-hcses ses;}.shaafsba{ihgd9gdgca-edhhihdc:-h7ses ses;}.shaaf7he{ihgd9gdgca-ed" - + "hhihdc:-hgses ses;}.sdaaag{ihgd9gdgca-edhhihdc:-hases ses;}.shaafagdeids {ihgd9gdgca-edhhihdc:-gsses ses;}.aaaaiafhbhaa{ihgd9gdgca-edhhihdc:-ggses ses;ggghdg:edhciag;}.egiahgfh7hga{ihgd9gdgca-edhhihdc" - + ":-gases ses;}.h7hga{ihgd9gdgca-edhhihdc:-gcses ses;}.eghahia{ihgd9gdgca-edhhihdc:-dsses ses;}.gddisdaaag{ihgd9gdgca-edhhihdc:-dcses ses;}.adacfhggda{ihgd9gdgca-edhhihdc:-a77es ses;ahai7:9ces;}.7aae{ih" - + "gd9gdgca-edhhihdc:-agses ses;}.ighh7 {ihgd9gdgca-edhhihdc:-acses ses;}.hggdafgh97i {ihgd9gdgca-edhhihdc:-bs7es ses;ahai7:9ces;}.igahagggbih {a7hia-hehga:cdaghe;}.igahagggbih .igahagggbihfgddi {aagihgh" - + "a-hah9c:bhaaaa;ehaahc9:s;}.igahagggbih .igahagggbihfhggda {aagihgha-hah9c:bhaaaa;ehaahc9-aasi:7es;}.igahagggbih .igahagggbihfahgchba {aagihgha-hah9c:bhaaaa;ehaahc9-aasi:7es;sdci-shbha9:aghha,aaaaaihgh" - + ",hhch-haghs;sdci-hh7a:9ab;}.igahagggbih .igahagggbihfahgchba hcegi {ihgd9gdgca:ighchehgaci;idgaag:cdca;ehaahc9:ses;bhg9hc:ses;ahai7:9ss%;}a {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;}a:ahcd {iasi" - + "-aagdghihdc:cdca;gdadg:#ssssss;}a:ahhhiaa {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:hgihaa {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:ahcd.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:ahhhiaa.i" - + "ddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:hgihaa.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ssssss;}a:7daag.iddaihgfigiidcfahcd {iasi-aagdghihdc:cdca;gdadg:#ggbggg;ggghdg:edhc" - + "iag;}a:ahcd.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-hh7a:dd%;}a:ahhhiaa.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-hh7a:dd%;}a:hgihaa.aaaaa9fiasi {iasi-aagdghihdc:gcaagahca;gdad" - + "g:#ssssss;sdci-hh7a:dd%;}a:7daag.aaaaa9fiasi {iasi-aagdghihdc:cdca;gdadg:#ggbggg;sdci-hh7a:dd%;ggghdg:edhciag;}a:ahcd.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-aah97i:idaa;sdci-hh" - + "7a:dd%;}a:ahhhiaa.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#gggggg;sdci-aah97i:idaa;sdci-hh7a:dd%;}a:hgihaa.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;sdci-aah97i:idaa;sdc" - + "i-hh7a:dd%;}a:7daag.aaaaa9fhgihaafhagihdc {iasi-aagdghihdc:cdca;gdadg:#ggbggg;sdci-hh7a:dd%;sdci-aah97i:idaa;ggghdg:edhciag;}a:ahcd.aaaaa7fiasi {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;}a:ahhhiaa.aaaaa7fia" - + "si {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;}a:hgihaa.aaaaa7fiasi {iasi-aagdghihdc:gcaagahca;gdadg:#cdcdcd;}a:7daag.aaaaa7fiasi {iasi-aagdghihdc:gcaagahca;gdadg:#ggbggg;ggghdg:edhciag;}a:ahcd.aaaaahfiasi {" - + "iasi-aagdghihdc:cdca;gdadg:#cdcdcd;ahca-7ah97i:7ses;}a:ahhhiaa.aaaaahfiasi {iasi-aagdghihdc:cdca;gdadg:#cdcdcd;ahca-7ah97i:7ses;}a:hgihaa.aaaaahfiasi {iasi-aagdghihdc:gcaagahca;gdadg:#cdcdcd;ahca-7ah9" - + "7i:7ses;}a:7daag.aaaaahfiasi {iasi-aagdghihdc:cdca;gdadg:#ggbggg;ggghdg:edhciag;ahca-7ah97i:7ses;}a:ahcd.gcaagahca {gdadg:#ssssss;iasi-aagdghihdc:gcaagahca;ggghdg:edhciag;}a:ahhhiaa.gcaagahca {gdadg:#" - + "ssssss;iasi-aagdghihdc:gcaagahca;}a:hgihaa.gcaagahca {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;}a:7daag.gcaagahca {iasi-aagdghihdc:gcaagahca;gdadg:#ggbggg;}.igahagggbih hcegi {ggghdg:edhciag;}.igahaggg" - + "bih hcegi:7daag.hchgihaa {ggghdg:aashgai;gdadg:#adadad;}a:7daag,a.sdggh,a:ahcd.sdggh,a:ahhhiaa.sdggh,a:7daag.sdggh,a:hgihaa.sdggh,.ihiehhi igiidc:7daag,.igahagggbih hcegi:7daag {iasi-aagdghihdc:cdca;g" - + "dadg:#ggbggg;ggghdg:edhciag;}h hb9 {idgaag:cdca;}ida9 {ehaahc9-gh97i:ses;ehaahc9-aasi:ses;ehaahc9-idiidb:ses;ehaahc9-ide:ses;bhg9hc-gh97i:ses;bhg9hc-aasi:ses;bhg9hc-ide:ses;bhg9hc-idiidb:ses;ihgd9gdgc" - + "a-gdadg:#gggggg;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:bg%;}ihiaa {sdci-hh7a:9ab;}ihiaa ihiaa {sdci-hh7a:9ss%;}.aasigadhi {sadhi:aasi;}i {sdci-aah97i:idaa;}.igiidc {sdci-shbha9:sh7d" - + "bh,aghha,aaaaaihgh,hhch-haghs;ehaahc9:des;iasi-hah9c:gaciag;sadhi:aasi;}.ihhhgsgiidc {ehaahc9:ses;bhg9hc:ses;idgaag-hi9aa:cdca;ihgd9gdgca-gdadg:ighchehgaci;ggghdg:edhciag;}.ihhhgsgiidc .igiidcfiasi {a" - + "hca-7ah97i:7ses;sdci-hh7a:9ab;}.ihhhgsgiidc.bdghadaag .igiidcfiasi {gdadg:#ggbggg;}.ihhhgsgiidc.hchgihaa .igiidcfiasi {gdadg:#sgsgsg;ggghdg:aashgai;}.aasifigiidc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hh" - + "ch-haghs;sdci-hh7a:s.dab;ehaahc9-ide:des;ehaahc9-aasi:des;ehaahc9-gh97i:des;iasi-hah9c:gaciag;sadhi:aasi;bhc-ahai7:dses;}.gh97ifigiidc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;eh" - + "aahc9:des;iasi-hah9c:gaciag;sadhi:gh97i;}.gdagbcf7ahaag {sdci-aah97i:idaa;sdci-hh7a:dd%;ahca-7ah97i:9des;gdadg:#ssssss;ehaahc9-ide:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:7es;a7hia-hehga:cdaghe;iasi-hah9c:" - + "aasi;}.hgdcfgdagbcf7ahaag {ehaahc9-aasi:7des;}.ahihfgda i7 {iasi-hah9c:aasi;sdci-aah97i:cdgbha;}.ahihfgda .cd7hih {iasi-hah9c:gaciag;}#idddbhgdfihiaa i7 h {ehaahc9-aasi:9ses;}.ahihfgda {7ah97i:7des;ih" - + "gd9gdgca-gdadg:#gggggg;}.ahihfahhi9dagbc {ehaahc9-aasi:des;ehaahc9-gh97i:des;ahca-7ah97i:7des;}.agdeadac {idgaag-idiidb:9es iahgd;idgaag-gh97i:9es iahgd;idgaag-aasi:9es #9s9s9s;idgaag-ide:9es #9s9s" - + "9s;ahhhihahi9:7haaac;edhhihdc:hihdagia;ahai7:7sses;7-hcaas:9;ehaahc9:ses;ggghdg:edhciag;}.haaagi {ihgd9gdgca-gdadg:#g9gdga;sadhi:aasi;}haaagi.gghiaghh {sdci-hh7a:s.dab;ahai7:9cses;}.hbhaa {sdci-hh7a:d" - + "d%;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;}.ihiaaaehgag {ahai7:7ses;}.iasihcegi {ehaahc9:des;bhg9hc:ses;aagihgha-hah9c:ide;}i7 {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-aah97i:idaa;" - + "sdci-hh7a:dd%;}.ihiaa {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;sdci-aah97i:idaa;}.ahaga {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.aaaaafiddaihg {gaahg:idi7;a" - + "hai7:hgid;7ah97i:gces;ihgd9gdgca-gdadg:#d77ahc;}.iddaihgfaasi {sadhi:aasi;ahai7:hgid;iasi-hah9c:gaciag;}.iddaihgfgh97i {sadhi:gh97i;ahai7:hgid;iasi-hah9c:gaciag;}aha.iddaihg {sadhi:aasi;}.iddaihgfid9f" - + "aasi {sadhi:aasi;}.iddaihgfid9 {gdadg:#ssssss;sadhi:aasi;}.iddaihgfid9fgh97i {sadhi:aasi;}.iddaihgfigiidc {sadhi:aasi;iasi-hah9c:gaciag;ggghdg:edhciag;ehaahc9:ces ses ces ses;bhg9hc:ses;idgaag:ses cdc" - + "a;ihgd9gdgca-gdadg:ighchehgaci;}.iddaihgfigiidc.hchgihaa {ggghdg:hgid;}.iddaihgfigiidcfhgdc {gaahg:gh97i;sadhi:cdca;bhg9hc-aasi:hgid;bhg9hc-gh97i:hgid;idgaag:ses;}.iddaihgfigiidc .igiidcfiasi,.iddaihg" - + "figiidc hehc {ahheah9:iadgd;sdci-hh7a:s.cab;ehaahc9-aasi:des;ehaahc9-gh97i:des;sdci-shbha9:aghha,aaaaaihgh,hhch-haghs;ahca-7ah97i:s.cab;iasi-aagdghihdc:cdca;}.iddaihgfigiidc.bdghadaag .igiidcfiasi {gd" - + "adg:#ggbggg;}.iddaihgfigiidc.hchgihaa .igiidcfiasi {gdadg:9gh9;}.iicfahih9dcigdafaasi {sadhi:aasi;ehaahc9-aasi:des;}.cdaghe,.cdaghe ia,.iaehiaa {a7hia-hehga:cdaghe;}ihiaa.cdaghe,ihiaa.cdaghe ig,ia.ag" - + "he {a7hia-hehga:cdgbha;}.ihifhbhaafaasi {sadhi:aasi;}.ihifhbhaafgh97i {sadhi:aasi;}.ihifhbhaafid9 {sadhi:aasi;sdci-hh7a:dd%;}.ihifhbhaafid9 h {ahca-7ah97i:7ses;ehaahc9-ide:7es;}.ihifhbhaafdssfaasi {" - + "sadhi:aasi;ahai7:7ses;ehaahc9-ide:7es;}.ihifhbhaafdssfgh97i {sadhi:aasi;ehaahc9-ide:7es;}.ihifhbhaafdssfid9 {sadhi:aasi;sdci-hh7a:dd%;ehaahc9-ide:7es;}aha.ihifhbhaa {idgaag-aasi:9es hdaha #7a77hh;id" - + "gaag-gh97i:9es hdaha #7a77hh;idgaag-idiidb:9es hdaha #7a77hh;}aha.aaaaa9 {ahai7:hgid;gaahg:idi7;}aha.aaaaa9faasi {sadhi:aasi;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:7es;7ah97i:9ges;}aha.aaaaa" - + "9fgh97i {sadhi:gh97i;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:7es;7ah97i:9ges;}.aaaaa9fiasi {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#gggggg;sdci-hh7a:dd%;ehaahc9-aasi:7es;ehaahc9-g" - + "h97i:7es;}.aaaaa9fad9hc {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#gggggg;sdci-hh7a:dd%;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-gh97i:des;}.aaaaa9fad9dgi {bhg9hc-gh97i:7es;}aha.ad9d {sad" - + "hi:aasi;}.aaaaa7fiasi {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;gdadg:#i7i7i7;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-gh97i:des;ahca-7ah97i:hhes;}.aaaaafadghihdc {gaahg:idi7;ahai7:hgid;7ah97i:7" - + "ces;ihgd9gdgca-gdadg:#d77ahc;edhhihdc:gaahihaa;}.adghihdcfaasi {bhg9hc-aasi:hes;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.aaaaafigahagggbi {gaahg:idi7;ahai7:hgid;7ah97i:7ces;ihgd9g" - + "dgca-gdadg:#d77ahc;}.igahagggbifaasi {ahai7:hgid;bhg9hc-gh97i:7dses;}.igahagggbifgh97i {sadhi:gh97i;ahai7:hgid;ahai7:7gces;}.igahagggbifigiidc {sadhi:aasi;bhg9hc-aasi:ses;bhg9hc-gh97i:ses;bhg9hc-ide:9" - + "es;ggghdg:edhciag;7ah97i:7ces;ihgd9gdgca-gdadg:ighchehgaci;idgaag:cdca;ehaahc9:ses;}.igahagggbifhbh9a {bhg9hc-aasi:hes;bhg9hc-gh97i:hes;bhg9hc-ide:9es;ggghdg:edhciag;7ah97i:7ces;idgaag:cdca;}.igahaggg" - + "bifehi7fgdcihhcag {ihgd9gdgca-gdadg:a7hia;ahai7:hgid;ehaahc9-ide:ses;ehaahc9-idiidb:ses;}.igahagggbihcah {ahai7:bes;7ah97i:7ces;ihgd9gdgca-gdadg:#d77ahc;}.igahagggbifehi7figiidc {sadhi:aasi;bhg9hc-gh9" - + "7i:9es;bhg9hc-ide:9es;bhg9hc-aasi:ses;}.cdsdgaag {idgaag:cdca;}.igahagggbifehi7fahcd {idgaag:cdca;}.igahagggbifehi7 {sadhi:aasi;}.igahagggbifehi7faasi,.igahagggbifehi7fgh97i {sdci-shbha9:sh7dbh,aghha," - + "aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}.igahagggbifehi7fiasi {iasi-aagdghihdc:cdca;gdadg:#ssssss;sdci-hh7a:s.dab;ahca-7ah97i:7ges;bhg9hc-aasi:hes;}.hahgg7fehi7fgdcihhcag7 {sadhi:gh97i;ihgd9gdgca-gdadg:a7" - + "hia;gdadg:9gh9;ehaahc9-ide:ses;ehaahc9-idiidb:ses;7ah97i:7ges;idgaag:7es hdaha #d77ahc;}.hahgg7fhcegi7 {sadhi:aasi;ahai7:9gces;aagihgha-hah9c:bhaaaa;bhg9hc-aasi:9es;idgaag:7es hdaha a7hia;ihgd9gdgca-g" - + "dadg:a7hia;}#hahgg7iasi {sdci-shbha9:sh7dbh,dacaah,hhch-haghs;sdci-hh7a:9ab;}#hahgg7sddaihg {sdci-hh7a:9ab;}.hahgg7fehi7figiidc {sadhi:aasi;bhg9hc-aasi:ses;bhg9hc-ide:9es;bhg9hc-gh97i:9es;ggghdg:edhci" - + "ag;idgaag:cdca;}.ahgagidg9fehi7 {sadhi:aasi;}aha.ehi7faasi,aha.ehi7fgh97i {sadhi:aasi;sdci-aah97i:cdgbha;bhg9hc:ses;ahca-7ah97i:7des;ihgd9gdgca-gdadg:#d77ahc;}aha.ggggacifehi7figiidch {ihgd9gdgca-gd" - + "adg:#d77ahc;sadhi:aasi;}aha.idddbhgdh {sadhi:aasi;ihgd9gdgca-gdadg:#d77ahc;7ah97i:7des;ahca-7ah97i:7des;}ga.idddbhgd {ihgd9gdgca-gdadg:#gsg9g9;}ah.idddbhgd {ahhi-hi9aa:cdca;ehaahc9-aasi:des;ehaahc9-id" - + "e:7es;ehaahc9-idiidb:ses;ehaahc9-gh97i:des;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;}ah.bhch9afidddbhgdh {ahhi-hi9aa:cdca;ehaahc9-aasi:des;ehaahc9-ide:7es;ehaahc9-idiidb:ses;ehaah" - + "c9-gh97i:des;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;idgaag-ide:9es hdaha #7d7d7d;sdci-hh7a:s.dab;}aha.hahgg7 {sadhi:aasi;ahai7:hgid;ihgd9gdgca-gdadg:#d77ahc;}aha.9dd9aafhahgg7 {sadhi:gh97i;ihg" - + "d9gdgca-gdadg:#d77ahc;}aha.hahgg7fids {sdci-aah97i:cdgbha;bhg9hc:ses;ahca-7ah97i:7des;sadhi:aasi;ihgd9gdgca-gdadg:#d77ahc;}.bacg {idgaag-idiidb:9es hdaha #cscscs;idgaag-gh97i:9es hdaha #cscscs;idgaag" - + "-ide:9es hdaha #gggggg;idgaag-aasi:9es hdaha #gggggg;ihgd9gdgca-gdadg:#gggggg;sdci-shbha9:aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;ehaahc9:ses;}aha.shaafbhch9ag {ehaahc9:ses;ihgd9gdgca-gdadg:#s7sca" - + "7;idgaag:9es hdaha #sgsgsg;ahai7:9ss%;sadhi:aasi;}aha.sddiag {ahai7:hgid;sadhi:gh97i;ehaahc9-ide:7es;ehaahc9-idiidb:ses;}aha.bahhh9a {sadhi:aasi;sdci-aah97i:cdgbha;sdci-hh7a:dd%;gdadg:iahgd;bhg9hc:se" - + "s;ahca-7ah97i:77es;ahai7:hgid;ehaahc9:7es;}.gh97ifgahgd {idgaag:9es hdaha #9s9s9s;ihgd9gdgca-gdadg:#gsgggg;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:s.dab;ahhhihahi9:7haaac;edhhihdc:hihd" - + "agia;ahai7:97ses;7-hcaas:9;ehaahc9:9ses;ggghdg:edhciag;}aha.ehgdehhi {ihgd9gdgca-gdadg:#gggggg;idgaag:9es hdaha #b99h7h;ehaahc9:des;}aha.ehgdehhiagah {gaahg:idi7;ehaahc9:9ses;}.bhch9afeh9a {ihgd9gdgca" - + "-gdadg:#ghghgh;}.gdbbaci {edhhihdc:gaahihaa;bhg9hc-ide:7es;ehaahc9:9ses;gaahg:gh97i;}.aaac9dbbaci {ihgd9gdgca:#gggggg;}.daa9dbbaci {ihgd9gdgca-gdadg:#ghghgh;idgaag-ide:#sgsgsg;idgaag-idiidb:#sgsgsg;}." - + "haa9dbbaciagah {bhg9hc-idiidb:des;}.gdbbaciagi7dg {sdci-hh7a:9ab;sdci-aah97i:idaa;ehaahc9-idiidb:des;}.gdbbacisasi {sdci-hh7a:dd%;ehaahc9-idiidb:9es;}.gdbbacishbahihbe {sdci-hh7a:s.cab;}.gdbbaci7aaaia" - + "97agdids {edhhihdc:hihdagia;gh97i:9ses;ide:9ses;ggghdg:edhciag;}aha.eh9afihiaa {gaahg:idi7;ahai7:hgid;}aha.hhaafchah9hihdc {bhg9hc-ide:ses;}ia.hhaafchah9hihdc {ihgd9gdgca-hbh9a:gga(hi9aah/hhaafchafid" - + "9.ge9);ihgd9gdgca-gaeahi:gaeahi-s;ahai7:9bdes;idgaag-gh97i:9es hdaha #sgsgsg;}.ihiehhi {bhg9hc-aasi:7ses;bhg9hc-ide:7ses;bhg9hc-idiidb:7ses;ehaahc9-aasi:9bes;}.ihiehhi igiidc {ihgd9gdgca-gdadg:ighcheh" - + "gaci;idgaag:ses cdca;bhg9hc:ses;ehaahc9:ses;ggghdg:edhciag;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;iasi-hah9c:aasi;}.ihiehhi ah {ehaahc9-aasi:ses;ehaahc9-ide:ses;ehaahc9-gh97i:ses;" - + "ehaahc9-idiidb:ges;ahhi-hi9aa-i9ea:cdca;sdci-hh7a:s.dab;}.aaihfhiabfhgihaa {ahhi-hi9aa-hbh9a:gga(hbh9ah/haaagiaafhgihdc.9hs);}.aaihfhiabfhgihaa igiidc {sdci-aah97i:idaa;}aha.gh97ifeh9afgdciaci {ahai7" - + ":hgid;ihgd9gdgca-gdadg:a7hia;}aha.hbhaafhgifiddaihg {ihgd9gdgca-gdadg:#9s9s9s;7ah97i:7des;ehaahc9-idiidb:des;}aha.hgifigiidc {sdci-hh7a:s.dab;ehaahc9-aasi:7es;ehaahc9-gh97i:7es;sadhi:aasi;iasi-hah9c:" - + "gaciag;}aha.eh9afihiaa {bhg9hc:ses;}.eh9afihiaa hcegi,.eh9afihiaa hgibhi,.eh9afihiaa haaagi,.eh9afihiaa iasihgah,.sdgbfgdciaci iasihgah {sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;}a" - + "ha.eh9afahih {bhg9hc:9ses;sadhi:aasi;}aha.bdahafsdgb {idgaag:9es hdaha #a9a9a9;bhc-ahai7:gases;}aha.sdgbfgdciaci {bhg9hc:7as;gaahg:idi7;ahai7:hgid;}.sdgbfgdciaci h {sdci-hh7a:9ab;}aha.sdgbfihiaafihg" - + " {idgaag-aasi:9es hdaha #b99h7h;idgaag-gh97i:9es hdaha #b99h7h;gaahg:idi7;}.sdgbfihiaafiasi {ahca-7ah97i:7aes;sdci-shbha9:sh7dbh,aghha,aaaaaihgh,hhch-haghs;sdci-hh7a:9ab;sdci-aah97i:idaa;gdadg:#hhhh" - + "hh;sdci-aah97i:idaa;aagihgha-hah9c:ihhaahca;bhg9hc:ses;ehaahc9-aasi:des;}.iicfeh9a9dcigdafaasi {ehaahc9-ide:ges;sadhi:aasi;}.iicfeh9a9dcigdafgh97i {ehaahc9-ide:ges;sadhi:gh97i;}aha.sdgbfgdcigdah {gaa" - + "hg:idi7;}aha.ghahdfigiidch {ehaahc9:des;}.aaig9sdgaag {idgaag:9es hdaha gaa;}.aaig9 {idgaag:9es hdaha #iii;}.haahcgaafhahgg7 {ahai7:hgid;gaahg:idi7;bhg9hc:9ses;ihgd9gdgca-gdadg:#ac7ahs;edhhihdc:gaah" - + "ihaa;}aha.hahgg7fid9 {edhhihdc:gaahihaa;ihgd9gdgca-gdadg:#h9h9h9;idgaag-idiidb:7es hdaha #d9a9sb;}.hahgg7fgdcihhcag {ahai7:hgid;bhg9hc-aasi:7ses;ehaahc9-ide:9ses;}aha.hahgg7fgefaasifgdgcag {sadhi:aa" - + "si;}aha.hahgg7fgefgh97ifgdgcag {sadhi:gh97i;}.hahgg7fihiaa {sdci-hh7a:dd%;sdci-aah97i:idaa;ehaahc9-aasi:des;ehaahc9-ide:des;}.hahgg7fgghiaghh {ehaahc9-aasi:9ses;ehaahc9-gh97i:ses;ehaahc9-ide:des;sdci-" - + "hh7a:dd%;ihgd9gdgca-gdadg:#gggggg;idgaag:9es hdaha #sgsgsg;}aha.hahgg7figiidcfgda {ehaahc9-ide:des;idgaag-ide:9es hdaha #sgsgsg;sadhi:aasi;ahai7:9ss%;}aha.hahgg7figiidcfgdcihhcag {sadhi:gh97i;}aha.hah" - + "gg7fhaa9ghiaghhfgda {idgaag-idiidb:9es hdaha #sgsgsg;sadhi:aasi;ahai7:9ss%;7ah97i:7des;}aha.hahgg7fgghiaghhfgdcihhcag {idgaag:7es hdaha #d9a9sb;ehaahc9:des;}.hgdcehiaafiasi {sadhi:aasi;bhg9hc:ses;7ah9" - + "7i:7des;ahca-7ah97i:7des;ehaahc9-gh97i:des;sdci-hh7a:dd%;sdci-aah97i:idaa;}aha.hgdc {ahai7:7des;7ah97i:7des;sadhi:aasi;}a:ahcd.hahgg79ghiaghhfiasi {iasi-aagdghihdc:gcaagahca;gdadg:#ssssss;sdci-hh7a" - + "{sadhi:aasi;ahhi-hi9aa:cdca;bhg9hc-ide:hes;}.7aae9dcihhcag {edhhihdc:hihdagia;ide:7es;gh97i:7es;bhg9hc:ses;ehaahc9:ses;idgaag:ses cdca;7-hcaas:g;ggghdg:edhciag;ahhhihahi9:hc7aghi;ihgd9gdgca-gdadg:ighc" - + "hehgaci;}.7aae9dcihhcagaihihg {bhg9hc:ses;ehaahc9:ses;ggghdg:edhciag;ahhhihahi9:hc7aghi;}.9gh-bdagaa .7aae9dcihhcag {gh97i:ges;}.9gh-ahhad9 .9gh-ehcaa .7aae9dcihhcag {gh97i:7ses;}.sdgb7hih {sdci-hh7a" - + ":9ab;}ihiaa.cdihs9shiaa {idgaag:ses;}ihiaa.cdihs9shiaa .aasi9dagbc {iasi-hah9c:gh97i;aagihgha-hah9c:ide;sdci-aah97i:idaa;}ihiaa.cdihs9shiaa .gh97i9dagbc {iasi-hah9c:aasi;}ihiaa.hgeagihiaa {bhg9hc:s s " - + "s 7es;}ihiaa.hgeagihiaa iida9 ig ia.geadhaf7ahaag {idgaag-ide:9es hdaha g9i(9g7,9g7,9g7);idgaag-gh97i:9es hdaha g9i(9g7,9g7,9g7);idgaag-idiidb:cdca;idgaag-aasi:9es hdaha g9i(9g7,9g7,9g7);ihgd9gdgca:g9" - + "i(77d,77d,77d);ehaahc9:s;sdci-hh7a:s;7ah97i:hses;}ihiaa.hgeagihiaa iida9 ig ia.geadhaf7ahaag ihiaa {sdci-aah97i:ass;sdci-hh7a:9ab;ihgd9gdgca:ighchehgaci;gdadg:iahgd;ahai7:9ss%;bhg9hc:s;}ihiaa.hgeagihi" - + "aa iida9 ig ia.gdcihhchfgeadha {bhg9hc:s;ehaahc9-aasi:s;}aha.geadha {bhg9hc:s;ehaahc9:s;daagsada:hgid;7ah97i:7hses;ahai7:asses;idgaag:9es hdaha g9i(9g7,9g7,9g7);ihgd9gdgca:a7hia;}aha.geadha ihiaa {7ah" - + "97i:9ss%;idgaag:cdca;}.geadha-daagaghia {}aha.geadha ihiaa iida9 ig {7ah97i:7des;}aha.geadha ihiaa iida9 ig#geadhafiahcdgda {7ah97i:hgid;}.geadhafsddiag {idgaag-ide:cdca;idgaag-gh97i:9es hdaha g9i(9g7" - + ",9g7,9g7);idgaag-idiidb:9es hdaha g9i(9g7,9g7,9g7);idgaag-aasi:9es hdaha g9i(9g7,9g7,9g7);7ah97i:hses;ihgd9gdgca:g9i(77d,77d,77d);}.iaehiaa {sdci-aah97i:idaa;}.ihiaaf7ahaag {sdci-aah97i:idaa;sdci-hh7a" - + ":9ab;gdadg:#ssssss;ahca-7ah97i:7hes;ahai7:9ss%;}.gh97ifihiaaf7ahaag {ahca-7ah97i:7hes;ahai7:hes;sdci-aah97i:idaa;gdadg:#ssssss;sdci-hh7a:9ab;}.aasifihiaaf7ahaag {ahca-7ah97i:7hes;ahai7:ges;sdci-aah97i" - + "{ihgd9gdgca-gdadg:#gggggg;ia77bgd-abdas:ses;ia77bgd-ehgs:ses;ia77bgd-shsshf:ses;ia77bgd-shi:hces;faadbg-abdas:des;faadbg-ehgs:des;faadbg-shi:hces;faadbg-shsshf:ses;ghgs-abah:9ss%;}.aabhcfhaiahiaa {" - + "sdci-hh7a:9ab;}#shaahgdgb {edhhihdc:hihdagia;ide:ses;aasi:ses;ahai7:ses;7ah97i:ses;}.aaaaafhgiihih {ihgd9gdgca-gdadg:#gggggg;7ah97i:7ses;}.gdagbcf7ahaagfadc9 {sdci-hh7a:dd%;7ah97i:hses;gdadg:#sssss" - + "s;}aha.ihifhaafeagbhhhhdch,aha.ihifihhhgfeagbhhhhdch {sadhi:aasi;ahai7:hgid;iasi-hah9c:gaciag;}aha.eagbhhhhdchbhhaehhi {bhg9hc:ses;ehaahc9-aasi:7ses;ehaahc9-ide:des;ehaahc9-idiidb:des;}aha.eagbhhhhdch" - + "bhhaehhi ga {bhg9hc:ses;ehaahc9:ses ses ses 9ses;}aha.hgdcehiaafiasi {sadhi:aasi;bhg9hc:ses;7ah97i:7des;ahca-7ah97i:7des;ehaahc9-gh97i:des;sdci-aah97i:idaa;}aha.hgdc {ahai7:7des;7ah97i:7des;sadhi:a" - + "asi;}a.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:ahhhiaa.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:7daag.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}a:hgihaa.ahia {gdadg:#ggssss;sdci-aah97i:cdgbha;}.ahia" - + "{9heha:#ggssss;ghgs-hhbdas:idaa;}.gh97ifiddaihg {sadhi:gh97i;ehaahc9-gh97i:des;}aha.asfhahgg7fid9 {bhg9hc-aasi:hes;bhg9hc-gh97i:hes;bhg9hc-idiidb:9ses;idgaag-idiidb:7es hdaha #d9a9sb;}.asfhahgg7 {ah" - + "ai7:hgid;gaahg:idi7;7ah97i:9hses;ehaahc9-ide:ses;bhg9hc:ses;ihgd9gdgca-gdadg:#d77ahc;}aha.asfhahgg7faasiaca {sadhi:aasi;}aha.asfhahgg7fgh97iaca {sadhi:gh97i;}.ahih h {sdci-hh7a:9ab;}.asfhahgg7fgdcihh" - + "cag {sadhi:aasi;bhg9hc-ide:des;}ia.asfhahgg7fiasi {sdci-hh7a:s.dab;}.asfhahgg7fiasi hcegi {sdci-hh7a:s.dab;}.asfhahgg7fiasi haaagi {sdci-hh7a:s.dab;}ia.asfihiaaaehgag {ahai7:9ses;}.asfihiaa9aaa {ehaah" - + "c9-aasi:9ses;ehaahc9-gh97i:des;}aha.hgihdcfhiae {ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:des;ehaahc9-gh97i:9ses;bhg9hc-gh97i:9des;ihgd9gdgca-gdadg:a7hia;idgaag-idiidb:7es dgihai;idgaag-gh97i:7" - + "es dgihai;ahai7:dd%;}aha.aaghhhdcfhiae {ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:des;ehaahc9-gh97i:des;ihgd9gdgca-gdadg:a7hia;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.i7" - + "ac {ihgd9gdgca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.i7acfida9 {ehaahc9-ide:des;ehaahc9-idiidb:" - + "des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.aaha {ihgd9gdgca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;a" - + "hai7:dd%;}aha.aahafida9 {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.haafhiae {ehaahc9-ide:9ses;ehaahc9-idiidb:9ses;iasi-hah9c:gaciag;}aha.casifhiae {ihgd9gd" - + "gca:#hhgggh;ehaahc9-ide:7es;ehaahc9-idiidb:7es;ehaahc9-aasi:7es;ehaahc9-gh97i:des;idgaag-idiidb:7es dgihai;idgaag-gh97i:7es dgihai;ahai7:dd%;}aha.hsfida9 {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aa" - + "si:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.ehghbaiagh {ehaahc9-ide:des;ehaahc9-idiidb:des;ehaahc9-aasi:9ses;ehaahc9-gh97i:des;ahai7:dd%;}aha.eh9afida9 {ehaahc9-ide:9ses;ehaahc9-aasi:9ses;}aha.h7dgifhgi" - + "hdcfchba {sdci-hh7a:9ss%;}aha.h7dgifaaghhhdcfchba {sdci-hh7a:9ss%;}.gahaagfcdihshghihdc {ahheah9:cdca;}.gahaaghaabaci {edhhihdc:hihdagia;ide:-9es;aasi:-9ses;7ah97i:9es;ahca-7ah97i:9es;idgaag:cdca;eh" - + "aahc9:ses;bhg9hc:ses;ahai7:9es;daagsada:7haaac;}ihiaa.dig i7 aha {edhhihdc:gaahihaa;ide:-9ses;7ah97i:9es;daagsada:7haaac;}.idaaehiaah ahiaa,.ahiaa {sdci-aah97i:idaa;sdci-hh7a:9ab;}shaaahai.ghahddgdge " - + "{ehaahc9:ses;idgaag:cdca;iasi-hah9c:aasi;}shaaahai.ghahddgdge aa9aca {ehaahc9:ses;}shaaahai.ghahddgdge aha {ehaahc9-aasi:7ses;ehaahc9-idiidb:des;}shaaahai.ghahddgdge ahiaa {ahheah9:iadgd;bhg9hc-aasi:9" - + "79.ihiaa,77.ihiaa {bhg9hc:ses;}.9gh-bdagaa,.ahdhfihi7haa9dciaci,.hahgg7fid9,.haahcgaafhahgg7 {7ddb:9;}.eghcghehaehhi {ahhi-hi9aa-i9ea:cdca;}.ihiehhi igiidc,.aaaaa7fbacg igiidc,.aaaaahfbacg igiidc,.ihh" - + "hgsgiidc,.iddaihgfigiidc,.igahagggbihfahgchba hcegi,.shaaa9hiabsgdahagsgaa hcegi {ahai7:hgid;daagsada:ahhhiaa;}.gbaiaeaahahc9h {ehaahc9-aasi:7ses;sdci-aah97i:idaa;sdci-hh7a:9ss%;}.9ghaids {ahai7:9ss%;" - + "sdci-shbha9:sh7dbh,dacaah,hhch-haghs;sdci-hh7a:9ss%;ehaahc9:ses;bhg9hc:ses;idgaag-idiidb:ses;idgaag-aasi:ses;idgaag-gh97i:ses;ihgd9gdgca-gdadg:#gshghg;daagsada:7haaac;}.digids hcegi {ggghdg:aashgai;}." - + "bgaihehhi {sadhi:aasi;ahheah9:hcahca;ehaahc9:s 7ses;bhg9hc:s;}.bgaihehhi .cd7hagah {ahhi-hi9aa:cdca;}.s9fgaciagidhhihdc {bhg9hc:ses hgid;}.ahdhfeh9a9dciaci {ihgd9gdgca-hbh9a:gga(hi9aah/ahdhfid9.ge9);i" - + "hgd9gdgca-gaeahi:gaeahi-9;}shca9haghaaaaagihdc,.asfhahgg7fid9,#aaaaa7,.aaaaa7fihifshaafaasi,.iddaihg,.iddaihgfid9,.aaaaa7fihih,.aaaaa7fbacg .ihifbha,.aaaaa7fihifshaafgh97i,aha.aaaaa7fhgihaa .ihifbha,." - + "ahdhfaaaaa9,.gdagbcf7ahaagfadc9,.ahdhfeh9ashiaa,.ahdhfeh9agddiag,.igahagggbifehi7fgdcihhcag,.ggggacifehi7figiidch,.hahgg7fids,#aaaaah,.aaaaahfchah9hihdc,.aaaaahfhgihaa .ihifbha,.ahdhfihi .ihisd9,.ahdh" - + "fihi .haaagiaa .ihisd9,.ahdhfihighaa,#aaaaa9,.aaaaa9,aha.9ghaids .s7ag,aha.9ghaids .sig,aha.9ghaids .sig ia,.gdagbcf7ahaag,.ihifhbhaafid9,.ihifhbhaafdssfid9,.eagbfihifhaaagiaa .ihifhbhaafid9,.ahdhfaaa" - + "aah {ihgd9gdgca-hbh9a:gga(heghiahfgfd.ec9);ihgd9gdgca-gaeahi:gaeahi-s;}shca9haghaaaaagihdc {ihgd9gdgca-edhhihdc:-ses -ses;7ah97i:9gces;}.asfhahgg7fid9 {ihgd9gdgca-edhhihdc:-ses -9gces;7ah97i:97ses;}#a" - + "aaaa7,.aaaaa7fihifshaafaasi {ihgd9gdgca-edhhihdc:-ses -7aces;7ah97i:gces;}.iddaihg,.iddaihgfid9 {ihgd9gdgca-edhhihdc:-ses -h9aes;7ah97i:gces;}a.aaaaa7fihih,.aaaaa7fbacg .ihifbha,.aaaaa7fihifshaafgh97i" - + " {ihgd9gdgca-edhhihdc:-ses -hages;7ah97i:hhes;}aha.aaaaa7fhgihaa .ihifbha {ihgd9gdgca-edhhihdc:-ses -hdbes;7ah97i:hhes;}.ahdhfaaaaa9 {ihgd9gdgca-edhhihdc:-ses -ghses;7ah97i:h7es;}.gdagbcf7ahaagfadc9 {" - + "ihgd9gdgca-edhhihdc:-ses -ga7es;7ah97i:hses;}.ahdhfeh9ashiaa {ihgd9gdgca-edhhihdc:-ses -gd7es;7ah97i:7des;}.hahgg7fgefgh97ifgdgcag {ihgd9gdgca-edhhihdc:-h9es -99ges;ahai7:9ses;7ah97i:ces;}.hahgg7fid9 " - + "{ihgd9gdgca-hbh9a:gga(hi9aah/haahcgaafehcaafid9.ge9);ihgd9gdgca-gaeahi:gaeahi-s;}.eh9afihiaa,aha.eh9afgdcigdah,aha.sdgbfgdcigdah,aha.9gh-ahhad9 aha.9gh-bdagaa aha.si,aha.gh97ifeh9afgdciaci aha.9gh-bda" - + "gaa aha.7a,aha.ggahiahh7hga9dciaciagah aha.9gh-bdagaa aha.si,aha.cdihs99dciaciagah aha.9gh-bdagaa aha.si,aha.agdesdshh7hga9dciaciagah aha.9gh-bdagaa aha.si,.sdgbfihiaafihg,aha.9gh-ahhad9 aha.9gh-bdaga" - + "a aha.7a,.hcaggaacfihiaashg,.ihiaaf7ahaag,.gh97ifihiaaf7ahaag,.aasifihiaaf7ahaag,.igiidcfid9,.hchgihaa .igiidcfid9 {ihgd9gdgca-hbh9a:gga(ihhaaeghiahfgfd.ec9);ihgd9gdgca-gaeahi:gaeahi-s;}.eh9afihiaa,ah" - + "a.eh9afgdcigdah,aha.sdgbfgdcigdah,aha.9gh-ahhad9 aha.9gh-bdagaa aha.si,aha.gh97ifeh9afgdciaci aha.9gh-bdagaa aha.7a,aha.ggahiahh7hga9dciaciagah aha.9gh-bdagaa aha.si,aha.cdihs99dciaciagah aha.9gh-bdag" - + "aa aha.si,aha.agdesdshh7hga9dciaciagah aha.9gh-bdagaa aha.si {ihgd9gdgca-edhhihdc:-ses -ses;7ah97i:7des;}.sdgbfihiaafihg,aha.9gh-ahhad9 aha.9gh-bdagaa aha.7a,.hcaggaacfihiaashg,.ihiaaf7ahaag,.gh97ifih" - + "iaaf7ahaag,.aasifihiaaf7ahaag {ihgd9gdgca-edhhihdc:-ses -7des;7ah97i:7aes;}.igiidcfid9 {edhhihdc:gaahihaa;bhg9hc-gh97i:7es;ehaahc9-gh97i:9hes;ehaahc9-aasi:9hes;bhg9hc-aasi:7es;a7hia-hehga:cdaghe;ihgd9" - + "gdgca-edhhihdc:-ses -ddes;7ah97i:77es;}.hchgihaa .igiidcfid9 {ihgd9gdgca-edhhihdc:-ses -bbes;7ah97i:77es;}.aashgaifad9d,.hchgihaa .igiidcfaasi,.igiidcfaasi,.igiidcfgh97i,.hchgihaa .igiidcfgh97i,.hgdcf" - + "hcsd,.hgdcfaggdg {ihgd9gdgca-hbh9a:gga(ihhaaeghiahfghgh.ec9);ihgd9gdgca-gaeahi:cd-gaeahi;}.aashgaifad9d {ihgd9gdgca-edhhihdc:-ses -ses;ahai7:c7es;7ah97i:hdes;}.hchgihaa .igiidcfaasi {ihgd9gdgca-edhhih" - + "dc:-c7es -ses;ahai7:9ges;7ah97i:77es;}.igiidcfaasi {edhhihdc:hihdagia;ide:ses;aasi:-7es;ihgd9gdgca-edhhihdc:-daes -ses;ahai7:9hes;7ah97i:77es;}.igiidcfgh97i {edhhihdc:hihdagia;ide:ses;gh97i:-7es;ihgd9" - + "gdgca-edhhihdc:-9sdes -ses;ahai7:9hes;7ah97i:77es;}.hchgihaa .igiidcfgh97i {ihgd9gdgca-edhhihdc:-977es -ses;ahai7:9hes;7ah97i:77es;}.hgdcfhcsd {ihgd9gdgca-edhhihdc:-c7es -77es;ahai7:9ges;7ah97i:9des;}" - + ".hgdcfaggdg {ihgd9gdgca-edhhihdc:-daes -77es;ahai7:9ges;7ah97i:9ges;}"; - - var largeNewValue = largeTest, - len = largeTest.length, - count = nextRandom() % 20, - removeBound = len-(count*100), - logData = []; - for (; count > 0; count--) { - var removePos = nextRandom() % removeBound; - var removeLength = 1+nextRandom()%100; - logData.push("(" + removePos + ", " + removeLength + ")"); - largeNewValue = largeNewValue.substring(0, removePos) - + largeNewValue.substring(removePos + removeLength); - } - log("len: " + len + " count: " + count + " removed ( " + logData.join(", ") + " )"); - - diffResult = diff.diffWords(largeTest, largeNewValue); - log("diffResult length: " + diffResult.length); - var removeCount = 0; - var removeChanges = [], addChanges = [], testChanges = []; - for (var i = 0; i < diffResult.length; i++) { - if (diffResult[i].removed) { - log("remove Change " + i, diffResult[i]); - removeChanges.push(diffResult[i].value); - } else if (diffResult[i].added) { - log("add Change " + i, diffResult[i]); - addChanges.push(diffResult[i].value); - } else { - log("no Change " + i, diffResult[i]); - removeChanges.push(diffResult[i].value); - addChanges.push(diffResult[i].value); - } - } - - log("diffResult remove length: " + removeCount); - assert.equal(largeTest.replace(/s+/g, ""), removeChanges.join("").replace(/s+/g, ""), "New Diff results match"); - assert.equal(largeNewValue.replace(/s+/g, ""), addChanges.join("").replace(/s+/g, ""), "Old Diff results match"); -}; - -exports['Patch'] = function() { - // Create patch - var oldFile = - "value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "remove value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "remove value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "value\n" - + "context\n" - + "context"; - var newFile = - "new value\n" - + "new value 2\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "add value\n" - + "context\n" - + "context\n" - + "context\n" - + "context\n" - + "new value\n" - + "new value 2\n" - + "context\n" - + "context"; - var expectedResult = - "Index: testFileName\n" - + "===================================================================\n" - + "--- testFileName\tOld Header\n" - + "+++ testFileName\tNew Header\n" - + "@@ -1,5 +1,6 @@\n" - + "+new value\n" - + "+new value 2\n" - + "-value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "@@ -7,9 +8,8 @@\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "-remove value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "@@ -17,20 +17,21 @@\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "-remove value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "+add value\n" - + " context\n" - + " context\n" - + " context\n" - + " context\n" - + "+new value\n" - + "+new value 2\n" - + "-value\n" - + " context\n" - + " context\n" - + "\\ No newline at end of file\n"; - - diffResult = diff.createPatch("testFileName", oldFile, newFile, "Old Header", "New Header"); - assert.equal( - expectedResult, - diffResult); - - expectedResult = - "Index: testFileName\n" - + "===================================================================\n" - + "--- testFileName\tOld Header\n" - + "+++ testFileName\tNew Header\n"; - diffResult = diff.createPatch("testFileName", oldFile, oldFile, "Old Header", "New Header"); - assert.equal( - expectedResult, - diffResult, - "Patch same diffResult Value"); -}; - -exports['convertToDMP'] = function() { - diffResult = diff.diffWords("New Value ", "New ValueMoreData "); - - assert.deepEqual( - [[0,'New '],[1,'ValueMoreData'],[-1,'Value'],[0,' ']], - diff.convertChangesToDMP(diffResult), - "DMP conversion of diffResult"); -}; diff --git a/node_modules/vows/node_modules/eyes/LICENSE b/node_modules/vows/node_modules/eyes/LICENSE deleted file mode 100644 index a1edd93..0000000 --- a/node_modules/vows/node_modules/eyes/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2009 cloudhead - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vows/node_modules/eyes/Makefile b/node_modules/vows/node_modules/eyes/Makefile deleted file mode 100644 index a121dea..0000000 --- a/node_modules/vows/node_modules/eyes/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -test: - @@node test/eyes-test.js - -.PHONY: test diff --git a/node_modules/vows/node_modules/eyes/README.md b/node_modules/vows/node_modules/eyes/README.md deleted file mode 100644 index c4f6f76..0000000 --- a/node_modules/vows/node_modules/eyes/README.md +++ /dev/null @@ -1,73 +0,0 @@ -eyes -==== - -a customizable value inspector for Node.js - -synopsis --------- - -I was tired of looking at cluttered output in the console -- something needed to be done, -`sys.inspect()` didn't display regexps correctly, and was too verbose, and I had an hour or two to spare. -So I decided to have some fun. _eyes_ were born. - -![eyes-ss](http://dl.dropbox.com/u/251849/eyes-js-ss.gif) - -_example of the output of a user-customized eyes.js inspector_ - -*eyes* also deals with circular objects in an intelligent way, and can pretty-print object literals. - -usage ------ - - var inspect = require('eyes').inspector({styles: {all: 'magenta'}}); - - inspect(something); // inspect with the settings passed to `inspector` - -or - - var eyes = require('eyes'); - - eyes.inspect(something); // inspect with the default settings - -you can pass a _label_ to `inspect()`, to keep track of your inspections: - - eyes.inspect(something, "a random value"); - -If you want to return the output of eyes without printing it, you can set it up this way: - - var inspect = require('eyes').inspector({ stream: null }); - - sys.puts(inspect({ something: 42 })); - -customization -------------- - -These are the default styles and settings used by _eyes_. - - styles: { // Styles applied to stdout - all: 'cyan', // Overall style applied to everything - label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]` - other: 'inverted', // Objects which don't have a literal representation, such as functions - key: 'bold', // The keys in object literals, like 'a' in `{a: 1}` - special: 'grey', // null, undefined... - string: 'green', - number: 'magenta', - bool: 'blue', // true false - regexp: 'green', // /\d+/ - }, - - pretty: true, // Indent object literals - hideFunctions: false, // Don't output functions at all - stream: process.stdout, // Stream to write to, or null - maxLength: 2048 // Truncate output if longer - -You can overwrite them with your own, by passing a similar object to `inspector()` or `inspect()`. - - var inspect = require('eyes').inspector({ - styles: { - all: 'magenta', - special: 'bold' - }, - maxLength: 512 - }); - diff --git a/node_modules/vows/node_modules/eyes/lib/eyes.js b/node_modules/vows/node_modules/eyes/lib/eyes.js deleted file mode 100644 index 10d964b..0000000 --- a/node_modules/vows/node_modules/eyes/lib/eyes.js +++ /dev/null @@ -1,236 +0,0 @@ -// -// Eyes.js - a customizable value inspector for Node.js -// -// usage: -// -// var inspect = require('eyes').inspector({styles: {all: 'magenta'}}); -// inspect(something); // inspect with the settings passed to `inspector` -// -// or -// -// var eyes = require('eyes'); -// eyes.inspect(something); // inspect with the default settings -// -var eyes = exports, - stack = []; - -eyes.defaults = { - styles: { // Styles applied to stdout - all: 'cyan', // Overall style applied to everything - label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]` - other: 'inverted', // Objects which don't have a literal representation, such as functions - key: 'bold', // The keys in object literals, like 'a' in `{a: 1}` - special: 'grey', // null, undefined... - string: 'green', - number: 'magenta', - bool: 'blue', // true false - regexp: 'green', // /\d+/ - }, - pretty: true, // Indent object literals - hideFunctions: false, - showHidden: false, - stream: process.stdout, - maxLength: 2048 // Truncate output if longer -}; - -// Return a curried inspect() function, with the `options` argument filled in. -eyes.inspector = function (options) { - var that = this; - return function (obj, label, opts) { - return that.inspect.call(that, obj, label, - merge(options || {}, opts || {})); - }; -}; - -// If we have a `stream` defined, use it to print a styled string, -// if not, we just return the stringified object. -eyes.inspect = function (obj, label, options) { - options = merge(this.defaults, options || {}); - - if (options.stream) { - return this.print(stringify(obj, options), label, options); - } else { - return stringify(obj, options) + (options.styles ? '\033[39m' : ''); - } -}; - -// Output using the 'stream', and an optional label -// Loop through `str`, and truncate it after `options.maxLength` has been reached. -// Because escape sequences are, at this point embeded within -// the output string, we can't measure the length of the string -// in a useful way, without separating what is an escape sequence, -// versus a printable character (`c`). So we resort to counting the -// length manually. -eyes.print = function (str, label, options) { - for (var c = 0, i = 0; i < str.length; i++) { - if (str.charAt(i) === '\033') { i += 4 } // `4` because '\033[25m'.length + 1 == 5 - else if (c === options.maxLength) { - str = str.slice(0, i - 1) + '…'; - break; - } else { c++ } - } - return options.stream.write.call(options.stream, (label ? - this.stylize(label, options.styles.label, options.styles) + ': ' : '') + - this.stylize(str, options.styles.all, options.styles) + '\033[0m' + "\n"); -}; - -// Apply a style to a string, eventually, -// I'd like this to support passing multiple -// styles. -eyes.stylize = function (str, style, styles) { - var codes = { - 'bold' : [1, 22], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'cyan' : [36, 39], - 'magenta' : [35, 39], - 'blue' : [34, 39], - 'yellow' : [33, 39], - 'green' : [32, 39], - 'red' : [31, 39], - 'grey' : [90, 39] - }, endCode; - - if (style && codes[style]) { - endCode = (codes[style][1] === 39 && styles.all) ? codes[styles.all][0] - : codes[style][1]; - return '\033[' + codes[style][0] + 'm' + str + - '\033[' + endCode + 'm'; - } else { return str } -}; - -// Convert any object to a string, ready for output. -// When an 'array' or an 'object' are encountered, they are -// passed to specialized functions, which can then recursively call -// stringify(). -function stringify(obj, options) { - var that = this, stylize = function (str, style) { - return eyes.stylize(str, options.styles[style], options.styles) - }, index, result; - - if ((index = stack.indexOf(obj)) !== -1) { - return stylize(new(Array)(stack.length - index + 1).join('.'), 'special'); - } - stack.push(obj); - - result = (function (obj) { - switch (typeOf(obj)) { - case "string" : obj = stringifyString(obj.indexOf("'") === -1 ? "'" + obj + "'" - : '"' + obj + '"'); - return stylize(obj, 'string'); - case "regexp" : return stylize('/' + obj.source + '/', 'regexp'); - case "number" : return stylize(obj + '', 'number'); - case "function" : return options.stream ? stylize("Function", 'other') : '[Function]'; - case "null" : return stylize("null", 'special'); - case "undefined": return stylize("undefined", 'special'); - case "boolean" : return stylize(obj + '', 'bool'); - case "date" : return stylize(obj.toUTCString()); - case "array" : return stringifyArray(obj, options, stack.length); - case "object" : return stringifyObject(obj, options, stack.length); - } - })(obj); - - stack.pop(); - return result; -}; - -// Escape invisible characters in a string -function stringifyString (str, options) { - return str.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/[\u0001-\u001F]/g, function (match) { - return '\\0' + match[0].charCodeAt(0).toString(8); - }); -} - -// Convert an array to a string, such as [1, 2, 3]. -// This function calls stringify() for each of the elements -// in the array. -function stringifyArray(ary, options, level) { - var out = []; - var pretty = options.pretty && (ary.length > 4 || ary.some(function (o) { - return (o !== null && typeof(o) === 'object' && Object.keys(o).length > 0) || - (Array.isArray(o) && o.length > 0); - })); - var ws = pretty ? '\n' + new(Array)(level * 4 + 1).join(' ') : ' '; - - for (var i = 0; i < ary.length; i++) { - out.push(stringify(ary[i], options)); - } - - if (out.length === 0) { - return '[]'; - } else { - return '[' + ws - + out.join(',' + (pretty ? ws : ' ')) - + (pretty ? ws.slice(0, -4) : ws) + - ']'; - } -}; - -// Convert an object to a string, such as {a: 1}. -// This function calls stringify() for each of its values, -// and does not output functions or prototype values. -function stringifyObject(obj, options, level) { - var out = []; - var pretty = options.pretty && (Object.keys(obj).length > 2 || - Object.keys(obj).some(function (k) { return typeof(obj[k]) === 'object' })); - var ws = pretty ? '\n' + new(Array)(level * 4 + 1).join(' ') : ' '; - - var keys = options.showHidden ? Object.keys(obj) : Object.getOwnPropertyNames(obj); - keys.forEach(function (k) { - if (Object.prototype.hasOwnProperty.call(obj, k) - && !(obj[k] instanceof Function && options.hideFunctions)) { - out.push(eyes.stylize(k, options.styles.key, options.styles) + ': ' + - stringify(obj[k], options)); - } - }); - - if (out.length === 0) { - return '{}'; - } else { - return "{" + ws - + out.join(',' + (pretty ? ws : ' ')) - + (pretty ? ws.slice(0, -4) : ws) + - "}"; - } -}; - -// A better `typeof` -function typeOf(value) { - var s = typeof(value), - types = [Object, Array, String, RegExp, Number, Function, Boolean, Date]; - - if (s === 'object' || s === 'function') { - if (value) { - types.forEach(function (t) { - if (value instanceof t) { s = t.name.toLowerCase() } - }); - } else { s = 'null' } - } - return s; -} - -function merge(/* variable args */) { - var objs = Array.prototype.slice.call(arguments); - var target = {}; - - objs.forEach(function (o) { - Object.keys(o).forEach(function (k) { - if (k === 'styles') { - if (! o.styles) { - target.styles = false; - } else { - target.styles = {} - for (var s in o.styles) { - target.styles[s] = o.styles[s]; - } - } - } else { - target[k] = o[k]; - } - }); - }); - return target; -} - diff --git a/node_modules/vows/node_modules/eyes/package.json b/node_modules/vows/node_modules/eyes/package.json deleted file mode 100644 index 0693505..0000000 --- a/node_modules/vows/node_modules/eyes/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "eyes", - "description": "a customizable value inspector", - "url": "http://github.com/cloudhead/eyes.js", - "keywords": [ - "inspector", - "debug", - "inspect", - "print" - ], - "author": { - "name": "Alexis Sellier", - "email": "self@cloudhead.net" - }, - "contributors": [ - { - "name": "Charlie Robbins", - "email": "charlie@nodejitsu.com" - } - ], - "licenses": [ - "MIT" - ], - "main": "./lib/eyes", - "version": "0.1.8", - "scripts": { - "test": "node test/*-test.js" - }, - "directories": { - "lib": "./lib", - "test": "./test" - }, - "engines": { - "node": "> 0.1.90" - }, - "readme": "eyes\n====\n\na customizable value inspector for Node.js\n\nsynopsis\n--------\n\nI was tired of looking at cluttered output in the console -- something needed to be done,\n`sys.inspect()` didn't display regexps correctly, and was too verbose, and I had an hour or two to spare. \nSo I decided to have some fun. _eyes_ were born.\n\n![eyes-ss](http://dl.dropbox.com/u/251849/eyes-js-ss.gif)\n\n_example of the output of a user-customized eyes.js inspector_\n\n*eyes* also deals with circular objects in an intelligent way, and can pretty-print object literals.\n\nusage\n-----\n\n var inspect = require('eyes').inspector({styles: {all: 'magenta'}});\n\n inspect(something); // inspect with the settings passed to `inspector`\n\nor\n\n var eyes = require('eyes');\n\n eyes.inspect(something); // inspect with the default settings\n\nyou can pass a _label_ to `inspect()`, to keep track of your inspections:\n\n eyes.inspect(something, \"a random value\");\n\nIf you want to return the output of eyes without printing it, you can set it up this way:\n\n var inspect = require('eyes').inspector({ stream: null });\n\n sys.puts(inspect({ something: 42 }));\n\ncustomization\n-------------\n\nThese are the default styles and settings used by _eyes_.\n\n styles: { // Styles applied to stdout\n all: 'cyan', // Overall style applied to everything\n label: 'underline', // Inspection labels, like 'array' in `array: [1, 2, 3]`\n other: 'inverted', // Objects which don't have a literal representation, such as functions\n key: 'bold', // The keys in object literals, like 'a' in `{a: 1}`\n special: 'grey', // null, undefined...\n string: 'green',\n number: 'magenta',\n bool: 'blue', // true false\n regexp: 'green', // /\\d+/\n },\n \n pretty: true, // Indent object literals\n hideFunctions: false, // Don't output functions at all\n stream: process.stdout, // Stream to write to, or null\n maxLength: 2048 // Truncate output if longer\n\nYou can overwrite them with your own, by passing a similar object to `inspector()` or `inspect()`.\n\n var inspect = require('eyes').inspector({\n styles: {\n all: 'magenta',\n special: 'bold'\n },\n maxLength: 512\n });\n\n", - "_id": "eyes@0.1.8", - "_from": "eyes@>=0.1.6" -} diff --git a/node_modules/vows/node_modules/eyes/test/eyes-test.js b/node_modules/vows/node_modules/eyes/test/eyes-test.js deleted file mode 100644 index 1f9606a..0000000 --- a/node_modules/vows/node_modules/eyes/test/eyes-test.js +++ /dev/null @@ -1,56 +0,0 @@ -var util = require('util'); -var eyes = require('../lib/eyes'); - -eyes.inspect({ - number: 42, - string: "John Galt", - regexp: /[a-z]+/, - array: [99, 168, 'x', {}], - func: function () {}, - bool: false, - nil: null, - undef: undefined, - object: {attr: []} -}, "native types"); - -eyes.inspect({ - number: new(Number)(42), - string: new(String)("John Galt"), - regexp: new(RegExp)(/[a-z]+/), - array: new(Array)(99, 168, 'x', {}), - bool: new(Boolean)(false), - object: new(Object)({attr: []}), - date: new(Date) -}, "wrapped types"); - -var obj = {}; -obj.that = { self: obj }; -obj.self = obj; - -eyes.inspect(obj, "circular object"); -eyes.inspect({hello: 'moto'}, "small object"); -eyes.inspect({hello: new(Array)(6) }, "big object"); -eyes.inspect(["hello 'world'", 'hello "world"'], "quotes"); -eyes.inspect({ - recommendations: [{ - id: 'a7a6576c2c822c8e2bd81a27e41437d8', - key: [ 'spree', 3.764316258020699 ], - value: { - _id: 'a7a6576c2c822c8e2bd81a27e41437d8', - _rev: '1-2e2d2f7fd858c4a5984bcf809d22ed98', - type: 'domain', - domain: 'spree', - weight: 3.764316258020699, - product_id: 30 - } - }] -}, 'complex'); - -eyes.inspect([null], "null in array"); - -var inspect = eyes.inspector({ stream: null }); - -util.puts(inspect('something', "something")); -util.puts(inspect("something else")); - -util.puts(inspect(["no color"], null, { styles: false })); diff --git a/node_modules/vows/package.json b/node_modules/vows/package.json deleted file mode 100644 index 0fdf835..0000000 --- a/node_modules/vows/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "vows", - "description": "Asynchronous BDD & continuous integration for node.js", - "url": "http://vowsjs.org", - "keywords": [ - "testing", - "spec", - "test", - "BDD" - ], - "author": { - "name": "Alexis Sellier", - "email": "self@cloudhead.net" - }, - "contributors": [ - { - "name": "Charlie Robbins", - "email": "charlie.robbins@gmail.com" - } - ], - "dependencies": { - "eyes": ">=0.1.6", - "diff": "~1.0.3" - }, - "main": "./lib/vows", - "bin": { - "vows": "./bin/vows" - }, - "directories": { - "test": "./test", - "bin": "./bin" - }, - "version": "0.6.4", - "scripts": { - "test": "node ./bin/vows --spec" - }, - "readme": "Vows\n====\n\n> Asynchronous BDD & continuous integration for node.js\n\n#### #\n\nintroduction\n------------\nThere are two reasons why we might want asynchronous testing. The first, and obvious reason is that node.js is asynchronous, and therefore our tests need to be. The second reason is to make test suites which target I/O libraries run much faster.\n\n_Vows_ is an experiment in making this possible, while adding a minimum of overhead.\n\nsynopsis\n--------\n\n var vows = require('vows'),\n assert = require('assert');\n\n vows.describe('Deep Thought').addBatch({\n 'An instance of DeepThought': {\n topic: new DeepThought,\n\n 'should know the answer to the ultimate question of life': function (deepThought) {\n assert.equal (deepThought.question('what is the answer to the universe?'), 42);\n }\n }\n });\n\ncoverage reporting\n------------------\nCode coverage reporting is available if _instrumented_ code is detected. Currently only _instrumentation_ via [node-jscoverage](https://github.com/visionmedia/node-jscoverage) is supported. When _instrumented_ code is detected and coverage reporting is enabled using any of the `--cover-plain`, `--cover-html`, or `--cover-json` options a code coverage map is generated.\n\n### downloading and installing [node-jscoverage](https://github.com/visionmedia/node-jscoverage)\n[node-jscoverage](https://github.com/visionmedia/node-jscoverage) is a binary package that needs to be compiled from source:\n\n $ git clone https://github.com/visionmedia/node-jscoverage.git\n $ cd node-jscoverage/\n $ ./configure\n checking for a BSD-compatible install... /usr/bin/install -c\n checking whether build environment is sane... yes\n [...]\n $ make && sudo make install\n\n### instrumenting with jscoverage\n\n $ jscoverage myfile.js myfile-instrumented.js\n \ninstallation\n------------\n\n $ npm install vows\n\ndocumentation\n-------------\n\nHead over to \n\nauthors\n-------\n\nAlexis Sellier <>, Charlie Robbins,\n\n*...and many others*\n\n", - "_id": "vows@0.6.4", - "_from": "vows@*" -} diff --git a/node_modules/vows/test/VowsCamelCaseTest.js b/node_modules/vows/test/VowsCamelCaseTest.js deleted file mode 100644 index 8923f1e..0000000 --- a/node_modules/vows/test/VowsCamelCaseTest.js +++ /dev/null @@ -1,14 +0,0 @@ -var vows = require('../lib/vows'), - assert = require('assert'); - -vows.describe("Vows test file with camel case").addBatch({ - - "The test file": { - topic: function () { - return { flag: true }; - }, - "is run": function (topic) { - assert.isTrue(topic.flag); - } - } -}).export(module); diff --git a/node_modules/vows/test/assert-test.js b/node_modules/vows/test/assert-test.js deleted file mode 100644 index 93d934c..0000000 --- a/node_modules/vows/test/assert-test.js +++ /dev/null @@ -1,137 +0,0 @@ -var vows = require('../lib/vows'); -var assert = require('assert'); - -vows.describe('vows/assert').addBatch({ - "The Assertion module": { - "`equal`": function () { - assert.equal("hello world", "hello world"); - assert.equal(1, true); - }, - "`epsilon`": function() { - assert.epsilon(1e-5, 0.1+0.2, 0.3); - }, - "`match`": function () { - assert.match("hello world", /^[a-z]+ [a-z]+$/); - }, - "`lengthOf`": function () { - assert.lengthOf("hello world", 11); - assert.lengthOf([1, 2, 3], 3); - assert.lengthOf({goo: true, gies: false}, 2); - }, - "`isDefined`": function () { - assert.isDefined(null); - assertError(assert.isDefined, undefined); - }, - "`include`": function () { - assert.include("hello world", "world"); - assert.include([0, 42, 0], 42); - assert.include({goo:true}, 'goo'); - }, - "`deepInclude`": function () { - assert.deepInclude([{a:'b'},{c:'d'}], {a:'b'}); - assert.deepInclude("hello world", "world"); - assert.deepInclude({goo:true}, 'goo'); - }, - "`typeOf`": function () { - assert.typeOf('goo', 'string'); - assert.typeOf(42, 'number'); - assert.typeOf([], 'array'); - assert.typeOf({}, 'object'); - assert.typeOf(false, 'boolean'); - }, - "`instanceOf`": function () { - assert.instanceOf([], Array); - assert.instanceOf(function () {}, Function); - }, - "`isArray`": function () { - assert.isArray([]); - assertError(assert.isArray, {}); - }, - "`isString`": function () { - assert.isString(""); - }, - "`isObject`": function () { - assert.isObject({}); - assertError(assert.isObject, []); - }, - "`isNumber`": function () { - assert.isNumber(0); - }, - "`isBoolean`": function (){ - assert.isBoolean(true); - assert.isBoolean(false); - assertError(assert.isBoolean, 0); - }, - "`isNan`": function () { - assert.isNaN(0/0); - }, - "`isTrue`": function () { - assert.isTrue(true); - assertError(assert.isTrue, 1); - }, - "`isFalse`": function () { - assert.isFalse(false); - assertError(assert.isFalse, 0); - }, - "`isZero`": function () { - assert.isZero(0); - assertError(assert.isZero, null); - }, - "`isNotZero`": function () { - assert.isNotZero(1); - }, - "`isUndefined`": function () { - assert.isUndefined(undefined); - assertError(assert.isUndefined, null); - }, - "`isDefined`": function () { - assert.isDefined(null); - assertError(assert.isDefined, undefined); - }, - "`isNull`": function () { - assert.isNull(null); - assertError(assert.isNull, 0); - assertError(assert.isNull, undefined); - }, - "`isNotNull`": function () { - assert.isNotNull(0); - }, - "`greater` and `lesser`": function () { - assert.greater(5, 4); - assert.lesser(4, 5); - }, - "`inDelta`": function () { - assert.inDelta(42, 40, 5); - assert.inDelta(42, 40, 2); - assert.inDelta(42, 42, 0); - assert.inDelta(3.1, 3.0, 0.2); - assertError(assert.inDelta, [42, 40, 1]); - }, - "`isEmpty`": function () { - assert.isEmpty({}); - assert.isEmpty([]); - assert.isEmpty(""); - }, - "`isNotEmpty`": function () { - assert.isNotEmpty({goo:true}); - assert.isNotEmpty([1]); - assert.isNotEmpty(" "); - assertError(assert.isNotEmpty, {}); - assertError(assert.isNotEmpty, []); - assertError(assert.isNotEmpty, ""); - } - } -}).export(module); - -function assertError(assertion, args, fail) { - if (!Array.isArray(args)) { args = [args]; } - try { - assertion.apply(null, args); - fail = true; - } catch (e) {/* Success */} - - fail && assert.fail(args.join(' '), assert.AssertionError, - "expected an AssertionError for {actual}", - "assertError", assertError); -} - diff --git a/node_modules/vows/test/fixtures/isolate/failing.js b/node_modules/vows/test/fixtures/isolate/failing.js deleted file mode 100644 index 7a1865e..0000000 --- a/node_modules/vows/test/fixtures/isolate/failing.js +++ /dev/null @@ -1,18 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('failing').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, false); - }, - 'should work': function (result) { - assert.ok(result); - } - // but it won't - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/log.js b/node_modules/vows/test/fixtures/isolate/log.js deleted file mode 100644 index 9828045..0000000 --- a/node_modules/vows/test/fixtures/isolate/log.js +++ /dev/null @@ -1,18 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('stderr').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, true); - }, - 'should work': function (result) { - console.log('oh no!'); - assert.ok(result); - } - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/passing.js b/node_modules/vows/test/fixtures/isolate/passing.js deleted file mode 100644 index 7f95730..0000000 --- a/node_modules/vows/test/fixtures/isolate/passing.js +++ /dev/null @@ -1,17 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('passing').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, true); - }, - 'should work': function (result) { - assert.ok(result); - } - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/isolate/stderr.js b/node_modules/vows/test/fixtures/isolate/stderr.js deleted file mode 100644 index 545ad20..0000000 --- a/node_modules/vows/test/fixtures/isolate/stderr.js +++ /dev/null @@ -1,18 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -var obvious; -vows.describe('stderr').addBatch({ - 'Obvious test': obvious = { - topic: function () { - this.callback(null, true); - }, - 'should work': function (result) { - console.error('oh no!'); - assert.ok(result); - } - }, - 'Obvious test #2': obvious, - 'Obvious test #3': obvious, - 'Obvious test #4': obvious -}).export(module); diff --git a/node_modules/vows/test/fixtures/supress-stdout/output.js b/node_modules/vows/test/fixtures/supress-stdout/output.js deleted file mode 100644 index e5c1635..0000000 --- a/node_modules/vows/test/fixtures/supress-stdout/output.js +++ /dev/null @@ -1,16 +0,0 @@ -var vows = require('../../../lib/vows'), - assert = require('assert'); - -vows.describe('output').addBatch({ - 'outputting': { - topic: function () { - console.log('goo'); - this.callback(null, true); - }, - 'should work': function (result) { - console.log('goo'); - assert.ok(result); - } - }, -}).export(module); - diff --git a/node_modules/vows/test/isolate-test.js b/node_modules/vows/test/isolate-test.js deleted file mode 100644 index 40f993b..0000000 --- a/node_modules/vows/test/isolate-test.js +++ /dev/null @@ -1,140 +0,0 @@ -var vows = require('../lib/vows'), - assert = require('assert'), - path = require('path'), - exec = require('child_process').exec; - -function generateTopic(args, file) { - return function () { - var cmd = './bin/vows' + ' -i ' + (args || '') + - ' ./test/fixtures/isolate/' + file, - options = {cwd: path.resolve(__dirname + '/../')}, - callback = this.callback; - - exec(cmd, options, function (err, stdout, stderr) { - callback(null, { - err: err, - stdout: stdout, - stderr: stderr - }); - }); - } -}; - -function assertExecOk(r) { - assert.isNull(r.err); -} - -function assertExecNotOk(r) { - assert.isNotNull(r.err); -} - -function parseResults(stdout) { - return stdout.split(/\n/g).map(function (s) { - if (!s) return; - return JSON.parse(s); - }).filter(function (s) {return s}); -} - -function assertResultTypePresent(results, type) { - assert.ok(results.some(function (result) { - return result[0] == type; - })); -} - -function assertResultsFinish(results, expected) { - var finish = results[results.length - 1]; - assert.equal(finish[0], 'finish'); - - finish = finish[1]; - - Object.keys(expected).forEach(function (key) { - assert.equal(finish[key], expected[key]); - }); -} - -vows.describe('vows/isolate').addBatch({ - 'Running vows with -i flag for test/fixtures/isolate/': { - 'passing.js': { - 'with default reporter': { - topic: generateTopic(null, 'passing.js'), - 'should be ok': assertExecOk - }, - 'with json reporter': { - topic: generateTopic('--json', 'passing.js'), - 'should be ok': assertExecOk, - 'should have correct output': function (r) { - var results = parseResults(r.stdout) - - assertResultTypePresent(results, 'subject'); - assertResultTypePresent(results, 'end'); - - assertResultsFinish(results, { - total: 4, - honored: 4 - }); - } - } - }, - 'failing.js': { - 'with json reporter': { - topic: generateTopic('--json', 'failing.js'), - 'should be not ok': assertExecNotOk, - 'should have correct output though': function (r) { - var results = parseResults(r.stdout); - - assertResultsFinish(results, { - total: 4, - broken: 4 - }); - } - } - }, - 'stderr.js': { - 'with json reporter': { - topic: generateTopic('--json', 'stderr.js'), - 'should be ok': assertExecOk, - 'should have stderr': function (r) { - assert.equal(r.stderr, - ['oh no!', 'oh no!', 'oh no!', 'oh no!', ''].join('\n')); - }, - 'should have correct output': function (r) { - var results= parseResults(r.stdout); - - assertResultsFinish(results, { - total: 4, - honored: 4 - }); - } - } - }, - 'log.js': { - 'with json reporter': { - topic: generateTopic('--json', 'log.js'), - 'should be ok': assertExecOk, - 'should have correct output': function (r) { - var results= parseResults(r.stdout); - - assertResultsFinish(results, { - total: 4, - honored: 4 - }); - } - } - }, - 'all tests (*)': { - 'with json reporter': { - topic: generateTopic('--json', '*'), - 'should be not ok': assertExecNotOk, - 'should have correct output': function (r) { - var results= parseResults(r.stdout); - - assertResultsFinish(results, { - total: 16, - broken: 4, - honored: 12 - }); - } - } - } - } -}).export(module); diff --git a/node_modules/vows/test/supress-stdout-test.js b/node_modules/vows/test/supress-stdout-test.js deleted file mode 100644 index 2321e4d..0000000 --- a/node_modules/vows/test/supress-stdout-test.js +++ /dev/null @@ -1,43 +0,0 @@ -var assert = require('assert'), - path = require('path'), - vows = require('../lib/vows'), - exec = require('child_process').exec; - -function generateTopic(supress) { - return function () { - var cmd = './bin/vows ' + (supress ? '--supress-stdout ' : '') + - './test/fixtures/supress-stdout/output.js', - options = {cwd: path.resolve(__dirname + '/../')}, - callback = this.callback; - - exec(cmd, options, function (err, stdout) { - callback(null, {err: err, stdout: stdout}); - }); - }; -} - -vows.describe('vows/supress-stdout').addBatch({ - 'Running vows for test/fixtures/supress-stdout/output.js': { - 'with --supress-stdout flag': { - topic: generateTopic(true), - 'should be ok': function (result) { - assert.isNull(result.err); - }, - 'should not contain output from stdout': function (result) { - assert.equal(result.stdout.toString().indexOf('goo'), -1); - // console.log output? - // nope, just Chuck Testa! - } - }, - 'without --supress-stdout flag': { - topic: generateTopic(), - 'should be ok': function (result) { - assert.isNull(result.err); - }, - 'should contain output from stdout': function (result) { - assert.notEqual(result.stdout.toString().indexOf('goo'), -1); - } - } - } -}).export(module); - diff --git a/node_modules/vows/test/vows-error-test.js b/node_modules/vows/test/vows-error-test.js deleted file mode 100644 index 79afaba..0000000 --- a/node_modules/vows/test/vows-error-test.js +++ /dev/null @@ -1,51 +0,0 @@ -var path = require('path'), - events = require('events'), - assert = require('assert'), - fs = require('fs'), - vows = require('../lib/vows'); - -function doSomethingAsync(callback) { - var err = null; - var testValue = 'a'; - - process.nextTick(function() { - callback(err, testValue); - }); -} - -function doSomethingAsyncWithError(callback) { - var err = true; - var testValue = 'a'; - - process.nextTick(function() { - callback(err, testValue); - }); -} - - -vows.describe('vows/error').addBatch({ - 'Generate success response to async function': { - topic: function() { - doSomethingAsync(this.callback) - }, - 'Validate success': function(err, testValue) { - assert.ok(!err); - }, - 'Validate testValue': function(err, testValue) { - assert.equal(testValue, 'a'); - } - }, - - 'Generate error response to async function': { - topic: function() { - doSomethingAsyncWithError(this.callback) - }, - 'Validate error': function(err, testValue) { - assert.ok(err); - }, - 'Validate testValue': function(err, testValue) { - // This assertion fails. It shouldn't. - assert.equal(testValue, 'a'); - } - } -}).export(module) \ No newline at end of file diff --git a/node_modules/vows/test/vows-test.js b/node_modules/vows/test/vows-test.js deleted file mode 100644 index d539a54..0000000 --- a/node_modules/vows/test/vows-test.js +++ /dev/null @@ -1,522 +0,0 @@ -var path = require('path'), - events = require('events'), - assert = require('assert'), - fs = require('fs'), - vows = require('../lib/vows'); - -var api = vows.prepare({ - get: function (id, callback) { - process.nextTick(function () { callback(null, id) }); - }, - version: function () { return '1.0' } -}, ['get']); - -var promiser = function (val) { - return function () { - var promise = new(events.EventEmitter); - process.nextTick(function () { promise.emit('success', val) }); - return promise; - } -}; - -vows.describe("Vows").addBatch({ - "A context": { - topic: promiser("hello world"), - - "with a nested context": { - topic: function (parent) { - this.state = 42; - return promiser(parent)(); - }, - "has access to the environment": function () { - assert.equal(this.state, 42); - }, - "and a sub nested context": { - topic: function () { - return this.state; - }, - "has access to the parent environment": function (r) { - assert.equal(r, 42); - assert.equal(this.state, 42); - }, - "has access to the parent context object": function (r) { - assert.ok(Array.isArray(this.context.topics)); - assert.include(this.context.topics, "hello world"); - } - } - } - }, - "A nested context": { - topic: promiser(1), - - ".": { - topic: function (a) { return promiser(2)() }, - - ".": { - topic: function (b, a) { return promiser(3)() }, - - ".": { - topic: function (c, b, a) { return promiser([4, c, b, a])() }, - - "should have access to the parent topics": function (topics) { - assert.equal(topics.join(), [4, 3, 2, 1].join()); - } - }, - - "from": { - topic: function (c, b, a) { return promiser([4, c, b, a])() }, - - "the parent topics": function(topics) { - assert.equal(topics.join(), [4, 3, 2, 1].join()); - } - } - } - } - }, - "Nested contexts with callback-style async": { - topic: function () { - fs.stat(__dirname + '/vows-test.js', this.callback); - }, - 'after a successful `fs.stat`': { - topic: function (stat) { - fs.open(__dirname + '/vows-test.js', "r", stat.mode, this.callback); - }, - 'after a successful `fs.open`': { - topic: function (fd, stat) { - fs.read(fd, stat.size, 0, "utf8", this.callback); - }, - 'after a successful `fs.read`': function (data) { - assert.match (data, /after a successful `fs.read`/); - } - } - } - }, - "A nested context with no topics": { - topic: 45, - ".": { - ".": { - "should pass the value down": function (topic) { - assert.equal(topic, 45); - } - } - } - }, - "A Nested context with topic gaps": { - topic: 45, - ".": { - ".": { - topic: 101, - ".": { - ".": { - topic: function (prev, prev2) { - return this.context.topics.slice(0); - }, - "should pass the topics down": function (topics) { - assert.lengthOf(topics, 2); - assert.equal(topics[0], 101); - assert.equal(topics[1], 45); - } - } - } - } - } - }, - "A non-promise return value": { - topic: function () { return 1 }, - "should be converted to a promise": function (val) { - assert.equal(val, 1); - } - }, - "A 'prepared' interface": { - "with a wrapped function": { - topic: function () { return api.get(42) }, - "should work as expected": function (val) { - assert.equal(val, 42); - } - }, - "with a non-wrapped function": { - topic: function () { return api.version() }, - "should work as expected": function (val) { - assert.equal(val, '1.0'); - } - } - }, - "A non-function topic": { - topic: 45, - - "should work as expected": function (topic) { - assert.equal(topic, 45); - } - }, - "A non-function topic with a falsy value": { - topic: 0, - - "should work as expected": function (topic) { - assert.equal(topic, 0); - } - }, - "A topic returning a function": { - topic: function () { - return function () { return 42 }; - }, - - "should work as expected": function (topic) { - assert.isFunction(topic); - assert.equal(topic(), 42); - }, - "in a sub-context": { - "should work as expected": function (topic) { - assert.isFunction(topic); - assert.equal(topic(), 42); - }, - } - }, - "A topic with a function that errors": { - topic: function() { - throw("Something wrong here"); - }, - "should error out": function(topic) { - assert.equal(topic, "Something wrong here"); - } - }, - "A topic emitting an error": { - topic: function () { - var promise = new(events.EventEmitter); - process.nextTick(function () { - promise.emit("error", 404); - }); - return promise; - }, - "shouldn't raise an exception if the test expects it": function (e, res) { - assert.equal(e, 404); - assert.ok(! res); - } - }, - "A topic not emitting an error": { - topic: function () { - var promise = new(events.EventEmitter); - process.nextTick(function () { - promise.emit("success", true); - }); - return promise; - }, - "should pass `null` as first argument, if the test is expecting an error": function (e, res) { - assert.strictEqual(e, null); - assert.equal(res, true); - }, - "should pass the result as first argument if the test isn't expecting an error": function (res) { - assert.equal(res, true); - } - }, - "A topic with callback-style async": { - "when successful": { - topic: function () { - var that = this; - process.nextTick(function () { - that.callback(null, "OK"); - }); - }, - "should work like an event-emitter": function (res) { - assert.equal(res, "OK"); - }, - "should assign `null` to the error argument": function (e, res) { - assert.strictEqual(e, null); - assert.equal(res, "OK"); - } - }, - "when unsuccessful": { - topic: function () { - function async(callback) { - process.nextTick(function () { - callback("ERROR"); - }); - } - async(this.callback); - }, - "should have a non-null error value": function (e, res) { - assert.equal(e, "ERROR"); - }, - "should work like an event-emitter": function (e, res) { - assert.equal(res, undefined); - } - }, - "using this.callback synchronously": { - topic: function () { - this.callback(null, 'hello'); - }, - "should work the same as returning a value": function (res) { - assert.equal(res, 'hello'); - } - }, - "using this.callback with a user context": { - topic: function () { - this.callback.call({ boo: true }, null, 'hello'); - }, - "should give access to the user context": function (res) { - assert.isTrue(this.boo); - } - }, - "passing this.callback to a function": { - topic: function () { - this.boo = true; - var async = function (callback) { - callback(null); - }; - async(this.callback); - }, - "should give access to the topic context": function () { - assert.isTrue(this.boo); - } - }, - "with multiple arguments": { - topic: function () { - this.callback(null, 1, 2, 3); - }, - "should pass them to the vow": function (e, a, b, c) { - assert.strictEqual(e, null); - assert.strictEqual(a, 1); - assert.strictEqual(b, 2); - assert.strictEqual(c, 3); - }, - "and a sub-topic": { - topic: function (a, b, c) { - return [a, b, c]; - }, - "should receive them too": function (val) { - assert.deepEqual(val, [1, 2, 3]); - } - } - } - } -}).addBatch({ - "A Sibling context": { - "'A', with `this.foo = true`": { - topic: function () { - this.foo = true; - return this; - }, - "should have `this.foo` set to true": function (res) { - assert.equal(res.foo, true); - } - }, - "'B', with nothing set": { - topic: function () { - return this; - }, - "shouldn't have access to `this.foo`": function (e, res) { - assert.isUndefined(res.foo); - } - } - } -}).addBatch({ - "A 2nd batch": { - topic: function () { - var p = new(events.EventEmitter); - setTimeout(function () { - p.emit("success"); - }, 100); - return p; - }, - "should run after the first": function () {} - } -}).addBatch({ - "A 3rd batch": { - topic: true, "should run last": function () {} - } -}).addBatch({}).export(module); - -vows.describe("Vows with a single batch", { - "This is a batch that's added as the optional parameter to describe()": { - topic: true, - "And a vow": function () {} - } -}).export(module); - -vows.describe("Vows with multiple batches added as optional parameters", { - "First batch": { - topic: true, - "should be run first": function () {} - } -}, { - "Second batch": { - topic: true, - "should be run second": function () {} - } -}).export(module); - -vows.describe("Vows with teardowns").addBatch({ - "A context": { - topic: function () { - return { flag: true }; - }, - "And a vow": function (topic) { - assert.isTrue(topic.flag); - }, - "And another vow": function (topic) { - assert.isTrue(topic.flag); - }, - "And a final vow": function (topic) { - assert.isTrue(topic.flag); - }, - 'subcontext': { - 'nested': function (_, topic) { - assert.isTrue(topic.flag); - } - }, - teardown: function (topic) { - topic.flag = false; - }, - "with a subcontext" : { - topic: function (topic) { - var that = this; - process.nextTick(function () { - that.callback(null, topic); - }); - }, - "Waits for the subcontext before teardown" : function(topic) { - assert.isTrue(topic.flag); - } - } - } -}).export(module); - -vows.describe("Vows with sub events").addBatch({ - "A context with sub-events": { - topic: function () { - var topic = new(events.EventEmitter); - topic.emit('before', 'before'); - - process.nextTick(function () { - topic.emit('request', 'request_data'); - }); - - process.nextTick(function () { - topic.emit('end', 'end_data'); - }); - - process.nextTick(function () { - topic.emit('nested', 'empty_nest'); - }); - - process.nextTick(function () { - topic.emit('success', 'legacey_data'); - }); - - return topic; - }, - on: { - "before": { - "will catch events emited before the topic returns" : function (ret) { - assert.strictEqual(ret, 'before'); - } - }, - "request": { - "will catch request": function (ret) { - assert.strictEqual(ret, 'request_data'); - }, - on: { - on: { - "end": { - "will require that 'end' is emitted after 'request'": function (ret) { - assert.strictEqual(ret, 'end_data'); - // TODO need a test that fails to prove this works - } - } - } - } - }, - on: { - on: { - "nested": { - "will catch nested, even if it is in empty nested 'on'": function (ret) { - assert.strictEqual(ret, 'empty_nest') - } - } - } - } - }, - "will catch the legacy success event": function (err, ret) { - assert.strictEqual(ret, 'legacey_data'); - } - }, - "Sub-events emitted by children of EventEmitter": { - topic: function() { - var MyEmitter = function () { - events.EventEmitter.call(this); - }; - require('util').inherits(MyEmitter, events.EventEmitter); - - var topic = new(MyEmitter); - process.nextTick(function () { - topic.emit('success', 'Legacy Does not Catch'); - }); - - return topic; - }, - "will return the emitter for traditional vows" : function (err, ret) { - assert.ok(ret instanceof events.EventEmitter); - }, - // events is an alias for on - events: { - "success" : { - "will catch the event" : function (ret) { - assert.strictEqual(ret, 'Legacy Does not Catch'); - }, - "will change events to on in the title" : function() { - assert.strictEqual(this.context.title, - 'Sub-events emitted by children of EventEmitter on success'); - } - } - } - } -}).export(module); - -var tornDown = false - -vows.describe("Vows with asynchonous teardowns").addBatch({ - "Context with long-running teardown": { - "is run first": function () {}, - teardown: function () { - var callback = this.callback; - - setTimeout(function () { - tornDown = true; - callback(); - }, 100); - } - } -}).addBatch({ - "The next batch": { - "is not run until the teardown is complete": function () { - assert.ok(tornDown); - } - } -}).export(module); - -vows.describe('Async topic is passed to vows with topic-less subcontext').addBatch({ - 'Async 42': { - topic: function () { - var callback = this.callback; - process.nextTick(function () { - callback(null, 42); - }); - }, - 'equals 42': function (topic) { - assert.equal(topic, 42); - }, - 'has the property that': { - 'it is equal to 42': function (topic) { - // <-- This vow fails, topic is undefined!? - assert.equal(topic, 42); - } - }, - 'plus 1': { - topic: function (parentTopic) { - return parentTopic + 1; - }, - 'equals 43': function (topic) { - assert.equal(topic, 43); - } - } - } -})['export'](module); diff --git a/node_modules/vows/test/vows_underscore_test.js b/node_modules/vows/test/vows_underscore_test.js deleted file mode 100644 index 1f3ce5c..0000000 --- a/node_modules/vows/test/vows_underscore_test.js +++ /dev/null @@ -1,14 +0,0 @@ -var vows = require('../lib/vows'), - assert = require('assert'); - -vows.describe("Vows test file with underscore").addBatch({ - - "The test file": { - topic: function () { - return { flag: true }; - }, - "is run": function (topic) { - assert.isTrue(topic.flag); - } - } -}).export(module); diff --git a/node_modules/waitress/README.md b/node_modules/waitress/README.md deleted file mode 100644 index 615e5a4..0000000 --- a/node_modules/waitress/README.md +++ /dev/null @@ -1,38 +0,0 @@ - -### Basic Usage - -```javascript -var done = waitress(count, cb); -``` - -Waitress returns a function, `done`, that will wait to be called `count` times before executing the `cb` passed into it. - -```javascript -var done = waitress(3, function(err) { - if (err) throw err; -}); - -done(); -done(new Error('oh noes')); // causes callback to be fired with an error condition -done(false); // also causes callback to be fired with an error condition -``` - -### Getting results - -If done receives a second parameter, waitress will add that to an array, -which will be the second parameter given to the callback, as long as it -receives no errors. - -The array will be built in the order the data is received, not the order -done appears in your code. - -```javascript -var done = waitress(3, function(err, result) { - if (err) throw err; - result === ['a', 'b', 'c']; -}); - -done(null, 'a'); -done(null, 'b'); -done(null, 'c'); -``` diff --git a/node_modules/waitress/index.js b/node_modules/waitress/index.js deleted file mode 100644 index 6885fea..0000000 --- a/node_modules/waitress/index.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; - -var waitress = function(count, cb) { - if (count === 0) { - cb(null); - return function() {}; - } - - var done = 0 - , cberr = null - , results - , args; - - var next = (function(err, result) { - ++done; - if (err instanceof Error) { - cberr = err; - } else if (err === false) { - cberr = cberr || new Error; - } - if (result !== undefined) { - results = results || [] - results.push(result); - } - if (done === count) { - args = [cberr]; - if (results && results.length) { - args.push(results); - } - cb.apply(null, args); - } - }); - return next; -}; - -module.exports = waitress; diff --git a/node_modules/waitress/package.json b/node_modules/waitress/package.json deleted file mode 100644 index 46ae683..0000000 --- a/node_modules/waitress/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "waitress", - "description": "Simple flow control for multiple parallel async calls.", - "author": { - "name": "Adam Blackburn", - "email": "adam@ifit.com" - }, - "version": "0.1.2", - "main": "index.js", - "keywords": [ - "flow-control", - "flow", - "waitress", - "async", - "parallel", - "callback" - ], - "repository": { - "type": "git", - "url": "git://github.com/ifit/waitress.git" - }, - "homepage": "https://github.com/ifit/waitress", - "readme": "\n### Basic Usage\n\n```javascript\nvar done = waitress(count, cb);\n```\n\nWaitress returns a function, `done`, that will wait to be called `count` times before executing the `cb` passed into it.\n\n```javascript\nvar done = waitress(3, function(err) {\n if (err) throw err;\n});\n\ndone();\ndone(new Error('oh noes')); // causes callback to be fired with an error condition\ndone(false); // also causes callback to be fired with an error condition\n```\n\n### Getting results\n\nIf done receives a second parameter, waitress will add that to an array,\nwhich will be the second parameter given to the callback, as long as it\nreceives no errors.\n\nThe array will be built in the order the data is received, not the order\ndone appears in your code.\n\n```javascript\nvar done = waitress(3, function(err, result) {\n if (err) throw err;\n result === ['a', 'b', 'c'];\n});\n\ndone(null, 'a');\ndone(null, 'b');\ndone(null, 'c');\n```\n", - "_id": "waitress@0.1.2", - "_from": "waitress@>=0.0.2" -} diff --git a/node_modules/waitress/test.js b/node_modules/waitress/test.js deleted file mode 100644 index bfc92ab..0000000 --- a/node_modules/waitress/test.js +++ /dev/null @@ -1,63 +0,0 @@ -var waitress = require('./index') - , assert = require('assert'); - -assert.throws(function() { - var done = waitress(3, function(err) { - if (err) throw err; - }); - - done(); - done(); - done(false); -}); - -assert.throws(function() { - var done = waitress(1, function(err) { - if (err) throw err; - }); - - done(new Error('hai tai mai shu')); -}, /hai tai mai shu/); - -// for zero args -assert.throws(function() { - var done = waitress(0, function(err) { - throw(new Error("zero args hurrr")); - }); -}, /zero args hurrr/); - -assert.doesNotThrow(function() { - var done = waitress(3, function(err) { - if (err) throw err; - }); - - done(); - done(); - done(); - done(false); -}); - -assert.throws(function() { - var done = waitress(3, function(err, results) { - if (err) throw err; - }); - - done(); - done(new Error("nein nein nein")); - done(new Error("no no no")); -}, /no no no/); - -(function() { - var done = waitress(3, function(err, results) { - if (err) throw err; - assert.deepEqual(results, [1, 2, 3], "results aggregation wrong"); - }); - - done(null, 1); - done(null, 2); - done(null, 3); - done(null, 4); -})(); - -console.log("No errors thrown, all tests must have passed."); - diff --git a/package.json b/package.json index 7de4c30..fd94583 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,6 @@ "geo", "api" ], - "bundledDependencies": [ - "request", - "waitress", - "vows" - ], "repository": { "type": "git", "url": "http://github.com/moshen/node-googlemaps" @@ -30,4 +25,4 @@ "scripts": { "test": "NODE_ENV=test vows test/*.js --spec" } -} +} \ No newline at end of file From ea37e35df8d138a58c4fd7f24551982fc5fcc7db Mon Sep 17 00:00:00 2001 From: Chase Brammer Date: Sun, 21 Oct 2012 10:53:37 -0600 Subject: [PATCH 7/7] fixing git ignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 823ac3f..11fb5ed 100644 --- a/.gitignore +++ b/.gitignore @@ -26,8 +26,6 @@ results /public/js/app.js /public/css/style.css npm-debug.log -/config/version.json -/config/local.json /client/config.js .build /docs