Skip to content

Commit

Permalink
New version check system
Browse files Browse the repository at this point in the history
  • Loading branch information
juhana committed Apr 9, 2014
1 parent 0d17cb0 commit 63ae549
Show file tree
Hide file tree
Showing 6 changed files with 151 additions and 86 deletions.
9 changes: 4 additions & 5 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,10 @@ Modules
- Changed the source code into a more modular system with actual private
variables. Functions and variables previously prefixed with underscore
can't be accessed outside the modules anymore.
- Common: release and version are now private variables, their values can be
retrieved with vorple.core.getRelease() and vorple.core.getVersion()
- Common: Added vorple.core.getEngine() to give the current engine object
- Common: requireRelease() now expects the release number to match exactly when
given a single integer parameter
- Core: Added vorple.core.getEngine() to give the current engine object
- Core: Version and release numbers combined into one version number which
can be retrieved with vorple.core.getVersion(). Changed requireRelease()
into requireVersion() which handles version numbers more flexibly.
- HTML: Fixed a bug where the second parameter to vorple.html.attributes()
would have no effect
- Media: Updated to work with SoundManager instead of jPlayer
Expand Down
2 changes: 1 addition & 1 deletion src/inform7/extensions/Vorple Common.i7x
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ First after printing the banner text (this is the display Vorple credits rule):
if Vorple is supported:
say "Vorple version ";
place inline element called "vorple-version";
execute JavaScript command "$('.vorple-version').html(vorple.core.getVersion()+'.'+vorple.core.getRelease())";
execute JavaScript command "$('.vorple-version').html(vorple.core.getVersion())";
say paragraph break.


Expand Down
182 changes: 117 additions & 65 deletions src/vorple.core.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,15 @@ var vorple = window.vorple = {};
*/
vorple.core = (function($){
var self = {},
/**
* Release number
*
* @private
* @field
* @name core~release
* @type number
*/
release = 5,
/**
* Version number
*
* @private
* @field
* @name core~version
* @type number
* @type string
*/
version = 2,
version = '2.5',
engine;

/**
Expand Down Expand Up @@ -73,14 +64,14 @@ vorple.core = (function($){
*
* @private
*/
var _init = function( initSystem ) {
var init = function( initSystem ) {
// save the engine
if( typeof initSystem !== 'undefined' ) {
engine = initSystem;
}

// insert the version number to the layout
$( '.vorple-version' ).html( version+'.'+release );
$( '.vorple-version' ).html( self.getVersion() );

// dialog that warns the player they're leaving the page
window.onbeforeunload = function( e ) {
Expand Down Expand Up @@ -209,6 +200,7 @@ vorple.core = (function($){
return id;
};


/**
* Returns the engine object.
*
Expand All @@ -223,25 +215,11 @@ vorple.core = (function($){
return engine;
};

/**
* Returns the current release number.
*
* @returns {number}
*
* @public
* @method
* @name core#getRelease
* @since 2.5
*/
self.getRelease = function() {
return release;
};


/**
* Returns the current version number.
*
* @returns {number}
* @returns {string}
*
* @public
* @method
Expand Down Expand Up @@ -271,65 +249,139 @@ vorple.core = (function($){
* @name core#init
*/
self.init = function( system ) {
_init( system );
init( system );
$( document ).trigger( 'init.vorple' );
};


/**
* Require a certain release of the Vorple library.
*
* The release number can be given as an array of two integers.
* The release number is then required to be inside the given range (inclusive).
* Require a certain version of the Vorple library.
*
* The accuracy of the check depends on the given parameter. Exact version
* number is assumed, except for parts of the version number that are
* omitted. For example if the actual current version number is 2.4.1, then:
*
* vorple.core.requireVersion( "2" ) => true
* vorple.core.requireVersion( "2.4" ) => true
* vorple.core.requireVersion( "2.4.1" ) => true
* vorple.core.requireVersion( "1" ) => error
* vorple.core.requireVersion( "2.3" ) => error
* vorple.core.requireVersion( "2.4.0" ) => error
* vorple.core.requireVersion( "2.4.2" ) => error
*
* The version number can be given as an array of two version numbers.
* The version number is then required to be inside the given range (inclusive).
*
* An error is thrown if the current version does not fit within the bounds.
* A second parameter can be given that contains the error message, or
* a function that will be called instead of throwing the error.
*
* @param {number|array} requiredRelease The exact allowed release or an array
* of [lowest, highest] required release
* @param {string|number|array} requiredVersion The exact allowed version or
* an array of [lowest, highest] required version
* @param {string|function} [message] The error message's text
* or a function to call on error
*
* @returns {boolean} True if release number is within bounds
* @returns {boolean} True if version number is within bounds
*
* @public
* @method
* @name core#requireRelease
* @name core#requireVersion
* @since 2.5
*/
self.requireRelease = function( requiredRelease, message ) {
var minRelease,
maxRelease,
requiredReleaseString;

if( $.isArray( requiredRelease ) ) {
minRelease = requiredRelease[0];
maxRelease = requiredRelease[1];
requiredReleaseString = minRelease+"-"+maxRelease;
self.requireVersion = function( requiredVersion, message ) {
// helper for changing all array values to integers
var parseArrayInt = function( arr ) {
return $.map( arr, function( element ) {
return parseInt( element, 10 );
});
};

var minVersion,
maxVersion,
requiredVersionString,
currentVersion = parseArrayInt( self.getVersion().split( '.' ) ),
minBoundaryOk = false,
maxBoundaryOk = false;

switch( typeof requiredVersion ) {
case 'object':
if( $.isArray( requiredVersion ) ) {
minVersion = requiredVersion[0];
maxVersion = requiredVersion[1];
requiredVersionString = minVersion+"-"+maxVersion;
}
break;

case 'number':
minVersion = requiredVersion.toString();
maxVersion = requiredVersion.toString();
requiredVersionString = requiredVersion.toString();
break;

case 'string':
minVersion = requiredVersion;
maxVersion = requiredVersion;
requiredVersionString = requiredVersion;
break;

default:
throw new Error( "Invalid type " + ( typeof requiredVersion ) + " given as a parameter to vorple.core.requireVersion()" );
}
else {
minRelease = requiredRelease;
maxRelease = requiredRelease;
requiredReleaseString = requiredRelease;

minVersion = parseArrayInt( minVersion.split( '.' ) );
maxVersion = parseArrayInt( maxVersion.split( '.' ) );

switch( minVersion.length ) {
case 1:
minBoundaryOk = ( minVersion[ 0 ] <= currentVersion[ 0 ] );
break;
case 2:
minBoundaryOk =
( minVersion[ 0 ] < currentVersion[ 0 ] )
|| ( minVersion[ 0 ] === currentVersion[ 0 ] && minVersion[ 1 ] <= currentVersion[ 1 ] );
break;
case 3:
minBoundaryOk =
( minVersion[ 0 ] < currentVersion[ 0 ] )
|| ( minVersion[ 0 ] === currentVersion[ 0 ] && minVersion[ 1 ] < currentVersion[ 1 ] )
|| ( minVersion[ 0 ] === currentVersion[ 0 ] && minVersion[ 1 ] === currentVersion[ 1 ] && minVersion[ 2 ] <= currentVersion[ 2 ] );
break;
}

if( minRelease > release || ( maxRelease !== false && maxRelease < release ) ) {
switch( typeof message ) {
case 'function':
message();
break;
case 'string':
throw new Error( message );
default:
throw new Error( "Version mismatch: release "
+ requiredReleaseString
+ " required, currently running release "
+ release
);
}
switch( maxVersion.length ) {
case 1:
maxBoundaryOk = ( maxVersion[ 0 ] >= currentVersion[ 0 ] );
break;
case 2:
maxBoundaryOk =
( maxVersion[ 0 ] > currentVersion[ 0 ] )
|| ( maxVersion[ 0 ] === currentVersion[ 0 ] && maxVersion[ 1 ] >= currentVersion[ 1 ] );
break;
case 3:
maxBoundaryOk =
( maxVersion[ 0 ] > currentVersion[ 0 ] )
|| ( maxVersion[ 0 ] === currentVersion[ 0 ] && maxVersion[ 1 ] > currentVersion[ 1 ] )
|| ( maxVersion[ 0 ] === currentVersion[ 0 ] && maxVersion[ 1 ] === currentVersion[ 1 ] && maxVersion[ 2 ] >= currentVersion[ 2 ] );
break;
}

return true;
if( minBoundaryOk && maxBoundaryOk ) {
return true;
}

switch( typeof message ) {
case 'function':
message();
break;
case 'string':
throw new Error( message );
default:
throw new Error( "Version mismatch: version "
+ requiredVersionString
+ " required, currently running version "
+ self.getVersion()
);
}
};

return self;
Expand Down
4 changes: 4 additions & 0 deletions src/vorple.parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,10 @@ vorple.parser = (function($) {
/**
* This is used by Parchment to determine which element to use for
* stream output.
*
* @public
* @method
* @name parser#getStream
*/
self.getStream = function() {
return _container.stream;
Expand Down
4 changes: 3 additions & 1 deletion tests/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@
<script src="../src/vorple.notify.js"></script>
<script src="../src/vorple.parser.js"></script>
<script src="../src/vorple.tooltip.js"></script>
<script src="../src/vorple.undum.js"></script>

<link rel="stylesheet" href="../lib/vorple.css">
<link rel="stylesheet" href="../vendor/parchment/parchment.css">
<link rel="stylesheet" href="../src/inform7/templates/Vorple/vorple.css">
</head>
<body>
<div id="qunit"></div>
Expand Down
36 changes: 22 additions & 14 deletions tests/vorple.core.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,32 +103,40 @@ test( 'onbeforeunload', function() {
vorple.core.settings = oldSettings;
});

test( 'requireRelease', function() {
var currentRel = vorple.core.getRelease();
test( 'getVersion', function() {
var version = vorple.core.getVersion();

ok( vorple.core.requireRelease( currentRel ), 'exact release' );
raises( function() { vorple.core.requireRelease( currentRel - 1 ); }, 'previous release' );
raises( function() {
vorple.core.requireRelease( currentRel + 1 );
}, 'next release' );
equal( typeof version, 'string', 'version number is returned as a string' );
ok( /^\d+\.\d+(\.\d+)?$/.test( version ), 'matches x.y[.z] format' );
});

test( 'requireVersion', function() {
var currentVersion = vorple.core.getVersion();

ok( vorple.core.requireVersion( currentVersion ), 'exact release' );
ok( vorple.core.requireVersion( parseInt( currentVersion, 10 ) ), 'major version, integer' );

raises( function() { vorple.core.requireVersion( '2.4' ); }, 'past release' );
raises( function() { vorple.core.requireVersion( '10.0' ); }, 'future release' );
raises( function() { vorple.core.requireVersion( 'foo' ); }, 'invalid version number' );

raises( function() {
vorple.core.requireRelease( currentRel + 1, 'Wrong release' );
vorple.core.requireVersion( '10.0', 'Wrong release' );
}, function( error ) {
return (error.message === "Wrong release" );
}, 'custom error message' );

ok( vorple.core.requireRelease( [ currentRel, currentRel + 1 ] ), 'with max release' );
ok( vorple.core.requireVersion( [ currentVersion, '10.0' ] ), 'with boundaries' );
raises( function() {
vorple.core.requireRelease( [ currentRel - 2, currentRel - 1 ] );
} );
vorple.core.requireVersion( [ 1, '2.3' ] );
}, 'past release boundaries' );

var errorCallback = false;

var callback = function() {
errorCallback = true;
};

vorple.core.requireRelease( currentRel + 1, callback );
ok( errorCallback, 'callback' );
} );
vorple.core.requireVersion( '10.0', callback );
ok( errorCallback, 'error callback' );
});

0 comments on commit 63ae549

Please sign in to comment.