Commit 0628688c 0628688ca810d353bc3b29d681ea8782fa2b3465 by Nicolas Perriault

bump 1.0

1 parent f1eb606a
CasperJS Changelog
==================
XXXX-XX-XX, v1.0.0
2012-12-24, v1.0.0
------------------
### Important Changes & Caveats
- PhantomJS 1.6.x support has been dropped. Both PhantomJS 1.7 & 1.8 will be supported.
- PhantomJS 1.6.x support has been dropped. Both PhantomJS [1.7](http://phantomjs.org/release-1.7.html) & [1.8](http://phantomjs.org/release-1.8.html) will be supported.
- the deprecated `injector` module has been removed from the codebase (RIP dude)
- a [`1.0` maintenance branch](https://github.com/n1k0/casperjs/tree/1.0) has been created
- CasperJS 1.1 development is now taking place on the `master` branch
### Bugfixes & enhancements
......
Subproject commit 1553f0b8338a1fc18f13615405ecd08e3eede21b
Subproject commit 058396e39822a5fa2d57e1a771ad2340ca0f358b
......
/*!
* Casper is a navigation utility for PhantomJS.
*
* Documentation: http://casperjs.org/
* Repository: http://github.com/n1k0/casperjs
*
* Copyright (c) 2011-2012 Nicolas Perriault
*
* Part of source code is Copyright Joyent, Inc. and other Node contributors.
*
* 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.
*
*/
/*global CasperError console encodeURIComponent escape exports require*/
// WARNING: this module is deprecated since CasperJS 1.0.0-RC3
var utils = require('utils');
exports.create = function create(fn) {
"use strict";
return new FunctionArgsInjector(fn);
};
/**
* Function argument injector.
*
* FIXME: use new Function() instead of eval()
*/
var FunctionArgsInjector = function FunctionArgsInjector(fn) {
"use strict";
console.error('Warning: the injector module has been deprecated.');
if (!utils.isFunction(fn)) {
throw new CasperError("FunctionArgsInjector() can only process functions");
}
this.fn = fn;
this.extract = function extract(fn) {
var match = /^function\s?(\w+)?\s?\((.*)\)\s?\{([\s\S]*)\}/i.exec(fn.toString().trim());
if (match && match.length > 1) {
var args = match[2].split(',').map(function _map(arg) {
return arg.replace(new RegExp(/\/\*+.*\*\//ig), "").trim();
}).filter(function _filter(arg) {
return arg;
}) || [];
return {
name: match[1] ? match[1].trim() : null,
args: args,
body: match[3] ? match[3].trim() : ''
};
}
};
this.process = function process(values) {
var fnObj = this.extract(this.fn);
if (!utils.isObject(fnObj)) {
throw new CasperError("Unable to process function " + this.fn.toString());
}
var inject = this.getArgsInjectionString(fnObj.args, values);
var newFn = new Function([inject, fnObj.body].join('\n'));
newFn.name = fnObj.name || '';
return newFn;
};
this.getArgsInjectionString = function getArgsInjectionString(args, values) {
values = typeof values === "object" ? values : {};
var jsonValues = escape(encodeURIComponent(JSON.stringify(values)));
var inject = [
'var __casper_params__ = JSON.parse(decodeURIComponent(unescape(\'' + jsonValues + '\')));'
];
args.forEach(function _forEach(arg) {
if (arg in values) {
inject.push('var ' + arg + '=__casper_params__["' + arg + '"];');
}
});
return inject.join('\n') + '\n';
};
};
exports.FunctionArgsInjector = FunctionArgsInjector;
{
"name": "casperjs",
"description": "Navigation scripting & testing utility for PhantomJS",
"version": "1.0.0-RC6",
"version": "1.0.0",
"keywords": [
"phantomjs",
"javascript"
......
%define name casperjs
%define version 1.0.0
%define release RC4_1
%define release 1_1
%define prefix /usr
%define mybuilddir %{_builddir}/%{name}-%{version}-root
......@@ -67,7 +67,6 @@ cp -R tests/* %{mybuilddir}%{prefix}/share/%{name}/tests/
%{prefix}/share/%{name}/modules/colorizer.js
%{prefix}/share/%{name}/modules/events.js
%{prefix}/share/%{name}/modules/http.js
%{prefix}/share/%{name}/modules/injector.js
%{prefix}/share/%{name}/modules/mouse.js
%{prefix}/share/%{name}/modules/querystring.js
%{prefix}/share/%{name}/modules/tester.js
......@@ -186,7 +185,6 @@ cp -R tests/* %{mybuilddir}%{prefix}/share/%{name}/tests/
%{prefix}/share/%{name}/tests/suites/fs.js
%{prefix}/share/%{name}/tests/suites/.casper
%{prefix}/share/%{name}/tests/suites/tester.js
%{prefix}/share/%{name}/tests/suites/injector.js
%{prefix}/share/%{name}/tests/suites/clientutils.js
%{prefix}/share/%{name}/tests/suites/http_status.js
%{prefix}/share/%{name}/tests/suites/xunit.js
......@@ -195,6 +193,9 @@ cp -R tests/* %{mybuilddir}%{prefix}/share/%{name}/tests/
%{prefix}/share/%{name}/tests/run.js
%changelog
* Mon Dec 24 2012 Nicolas Perriault <nicolas@perriault.net>
- removed 'injector.js' module
* Mon Dec 10 2012 Jan Schaumann <jschauma@etsy.com>
- include 'tests'
......
/*global casper*/
/*jshint strict:false*/
var t = casper.test;
var createInjector = function(fn, values) {
return require('injector').create(fn, values);
};
var testFn = function(a, b) { return a + b; };
var injector = createInjector(testFn);
var extract = injector.extract(testFn);
t.comment('FunctionArgsInjector.extract()');
t.assertType(extract, "object", 'FunctionArgsInjector.extract() returns an object');
t.assertEquals(extract.name, null, 'FunctionArgsInjector.extract() process function name as expected');
t.assertEquals(extract.body, 'return a + b;', 'FunctionArgsInjector.extract() process function body as expected');
t.assertEquals(extract.args, ['a', 'b'], 'FunctionArgsInjector.extract() process function args as expected');
function Plop(foo, bar) {
return 'foo: ' + foo +', bar: ' + bar;
}
function Plip() { return 'plop'; }
function foo_bar(boz) {}
var gni = function ($bubu_bibi, __popo__) {};
var gno = function ( arg1, /*plop*/ arg2 ) { };
function issue129(term) {
// see issue #129
return term;
// see issue #129
}
t.assertEquals(injector.extract(Plop), {
name: 'Plop',
args: ['foo', 'bar'],
body: "return 'foo: ' + foo +', bar: ' + bar;"
}, 'FunctionArgsInjector.extract() handles named functions with arguments and body');
t.assertEquals(injector.extract(Plip), {
name: 'Plip',
args: [],
body: "return 'plop';"
}, 'FunctionArgsInjector.extract() handles functions with no arguments');
t.assertEquals(injector.extract(foo_bar), {
name: 'foo_bar',
args: ['boz'],
body: ""
}, 'FunctionArgsInjector.extract() handles functions with no body');
t.assertEquals(injector.extract(gni), {
name: null,
args: ['$bubu_bibi', '__popo__'],
body: ""
}, 'FunctionArgsInjector.extract() handles anonymous functions with complex args passed');
t.assertEquals(injector.extract(gno), {
name: null,
args: ['arg1', 'arg2'],
body: ""
}, 'FunctionArgsInjector.extract() handles can filter comments in function args');
t.comment('FunctionArgsInjector.process()');
var processed;
eval('processed = ' + injector.process({ a: 1, b: 2 }));
t.assertType(processed, "function", 'FunctionArgsInjector.process() processed a function');
t.assertEquals(processed(), 3, 'FunctionArgsInjector.process() processed the function correctly');
// Issue #129
var fnIssue129 = createInjector(issue129).process({term: 'fixed'});
t.assertEquals(fnIssue129('fixed'), 'fixed', 'FunctionArgsInjector.process() has issue #129 fixed');
t.done(12);