Browse Source

Simplify Meteor packaging and add Windows support

pull/534/head
Dan Dascalescu 9 years ago
parent
commit
bbb0d102c0
  1. 34
      meteor/.versions
  2. 6
      meteor/README.md
  3. 94
      meteor/package.js
  4. 44
      meteor/publish.sh
  5. 8
      meteor/runtests.bat
  6. 41
      meteor/runtests.sh

34
meteor/.versions

@ -0,0 +1,34 @@
base64@1.0.3
binary-heap@1.0.3
blaze@2.1.2
blaze-tools@1.0.3
callback-hook@1.0.3
check@1.0.5
dburles:mongo-collection-instances@0.3.4
ddp@1.1.0
deps@1.0.7
ejson@1.0.6
geojson-utils@1.0.3
html-tools@1.0.4
htmljs@1.0.4
id-map@1.0.3
jquery@1.11.3_2
json@1.0.3
lai:collection-extensions@0.1.4
local-test:rubaxa:sortable@1.2.1
logging@1.0.7
meteor@1.1.6
minifiers@1.1.5
minimongo@1.0.8
mongo@1.1.0
observe-sequence@1.0.6
ordered-dict@1.0.3
random@1.0.3
reactive-var@1.0.5
retry@1.0.3
rubaxa:sortable@1.2.1
spacebars-compiler@1.0.6
templating@1.1.1
tinytest@1.0.5
tracker@1.0.7
underscore@1.0.3

6
meteor/README.md

@ -12,7 +12,7 @@ Demo: http://rubaxa-sortable.meteor.com
If you're new to Meteor, here's what the excitement is all about - If you're new to Meteor, here's what the excitement is all about -
[watch the first two minutes](https://www.youtube.com/watch?v=fsi0aJ9yr2o); you'll be hooked by 1:28. [watch the first two minutes](https://www.youtube.com/watch?v=fsi0aJ9yr2o); you'll be hooked by 1:28.
That screencast is from 2012. In the meantime, Meteor has become a mature JavaScript-everywhere web That screencast is from 2012. In the meantime, Meteor has become a mature JavaScript-everywhere web
development framework. Read more at [Why Meteor](http://www.meteorpedia.com/read/Why_Meteor). development framework. Read more at [Why Meteor](http://wiki.dandascalescu.com/essays/why_meteor).
# Usage # Usage
@ -81,9 +81,9 @@ Template.myTemplate.helpers({
}); });
``` ```
#### meteor specific options #### Meteor-specific options
* `selector` - you can specify collection selector if your list operates only on subset of collection. Example: * `selector` - you can specify a collection selector if your list operates only on a subset of the collection. Example:
```js ```js
Template.myTemplate.helpers({ Template.myTemplate.helpers({

94
meteor/package.js

@ -1,35 +1,85 @@
// package metadata file for Meteor.js // Package metadata file for Meteor.js
'use strict'; 'use strict';
var packageName = 'rubaxa:sortable'; // http://atmospherejs.com/rubaxa/sortable var packageName = 'rubaxa:sortable'; // https://atmospherejs.com/rubaxa/sortable
var gitHubPath = 'RubaXa/Sortable'; // https://github.com/RubaXa/Sortable
var npmPackageName = 'sortablejs'; // https://www.npmjs.com/package/sortablejs - optional but recommended; used as fallback if GitHub fails
var packageJson = JSON.parse(Npm.require("fs").readFileSync('package.json')); /* All of the below is just to get the version number of the 3rd party library.
* First we'll try to read it from package.json. This works when publishing or testing the package
* but not when running an example app that uses a local copy of the package because the current
* directory will be that of the app, and it won't have package.json. Finding the path of a file is hard:
* http://stackoverflow.com/questions/27435797/how-do-i-obtain-the-path-of-a-file-in-a-meteor-package
* Therefore, we'll fall back to GitHub (which is more frequently updated), and then to NPMJS.
* We also don't have the HTTP package at this stage, and if we use Package.* in the request() callback,
* it will error that it must be run in a Fiber. So we'll use Node futures.
*/
var request = Npm.require('request');
var Future = Npm.require('fibers/future');
var fut = new Future;
var version;
if (!version) try {
var packageJson = JSON.parse(Npm.require('fs').readFileSync('../package.json'));
version = packageJson.version;
} catch (e) {
// if the file was not found, fall back to GitHub
console.warn('Could not find ../package.json to read version number from; trying GitHub...');
var url = 'https://api.github.com/repos/' + gitHubPath + '/tags';
request.get({
url: url,
headers: {
'User-Agent': 'request' // GitHub requires it
}
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
var versions = JSON.parse(body).map(function (version) {
return version['name'].replace(/^\D+/, '') // trim leading non-digits from e.g. "v4.3.0"
}).sort();
fut.return(versions[versions.length -1]);
} else {
// GitHub API rate limit reached? Fall back to npmjs.
console.warn('GitHub request to', url, 'failed:\n ', response && response.statusCode, response && response.body, error || '', '\nTrying NPMJS...');
url = 'http://registry.npmjs.org/' + npmPackageName + '/latest';
request.get(url, function (error, response, body) {
if (!error && response.statusCode === 200)
fut.return(JSON.parse(body).version);
else
fut.throw('Could not get version information from ' + url + ' either (incorrect package name?):\n' + (response && response.statusCode || '') + (response && response.body || '') + (error || ''));
});
}
});
version = fut.wait();
}
// Now that we finally have an accurate version number...
Package.describe({ Package.describe({
name: packageName, name: packageName,
summary: 'Sortable: reactive minimalist reorderable drag-and-drop lists on modern browsers and touch devices', summary: 'Sortable: reactive minimalist reorderable drag-and-drop lists on modern browsers and touch devices',
version: packageJson.version, version: version,
git: 'https://github.com/RubaXa/Sortable.git', git: 'https://github.com/RubaXa/Sortable.git',
documentation: 'meteor/README.md' documentation: 'README.md'
}); });
Package.onUse(function (api) { Package.onUse(function (api) {
api.versionsFrom(['METEOR@0.9.0', 'METEOR@1.0']); api.versionsFrom(['METEOR@0.9.0', 'METEOR@1.0']);
api.use('templating', 'client'); api.use('templating', 'client');
api.use('dburles:mongo-collection-instances@0.3.4'); // to watch collections getting created api.use('dburles:mongo-collection-instances@0.3.4'); // to watch collections getting created
api.export('Sortable'); // exported on the server too, as a global to hold the array of sortable collections (for security) api.export('Sortable'); // exported on the server too, as a global to hold the array of sortable collections (for security)
api.addFiles([ api.addFiles([
'Sortable.js', '../Sortable.js',
'meteor/template.html', // the HTML comes first, so reactivize.js can refer to the template in it 'template.html', // the HTML comes first, so reactivize.js can refer to the template in it
'meteor/reactivize.js' 'reactivize.js'
], 'client'); ], 'client');
api.addFiles('meteor/methods-client.js', 'client'); api.addFiles('methods-client.js', 'client');
api.addFiles('meteor/methods-server.js', 'server'); api.addFiles('methods-server.js', 'server');
}); });
Package.onTest(function (api) { Package.onTest(function (api) {
api.use(packageName, 'client'); api.use(packageName, 'client');
api.use('tinytest', 'client'); api.use('tinytest', 'client');
api.addFiles('meteor/test.js', 'client'); api.addFiles('test.js', 'client');
}); });

44
meteor/publish.sh

@ -5,36 +5,22 @@
# The curl'ed script is totally safe; takes 2 minutes to read its source and check. # The curl'ed script is totally safe; takes 2 minutes to read its source and check.
type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; } type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; }
# sanity check: make sure we're in the root directory of the checkout # sanity check: make sure we're in the directory of the script
cd "$( dirname "$0" )/.." cd "$( dirname "$0" )"
ALL_EXIT_CODE=0 # publish package, creating it if it's the first time we're publishing
PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2)
# test any package*.js packages we may have, e.g. package.js, package-compat.js echo "Publishing $PACKAGE_NAME..."
for PACKAGE_FILE in meteor/package*.js; do
# Meteor expects package.js to be in the root directory of the checkout, so copy there our package file under that name, temporarily # Attempt to re-publish the package - the most common operation once the initial release has
cp $PACKAGE_FILE ./package.js # been made. If the package name was changed (rare), you'll have to pass the --create flag.
meteor publish "$@"; EXIT_CODE=$?
if (( $EXIT_CODE == 0 )); then
echo "Thanks for releasing a new version. You can see it at"
echo "https://atmospherejs.com/${PACKAGE_NAME/://}"
else
echo "We have an error. Please post it at https://github.com/RubaXa/Sortable/issues"
fi
# publish package, creating it if it's the first time we're publishing exit $EXIT_CODE
PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2)
echo "Publishing $PACKAGE_NAME..."
# Attempt to re-publish the package - the most common operation once the initial release has
# been made. If the package name was changed (rare), you'll have to pass the --create flag.
meteor publish "$@"; EXIT_CODE=$?
ALL_EXIT_CODE=$(( $ALL_EXIT_CODE + $EXIT_CODE ))
if (( $EXIT_CODE == 0 )); then
echo "Thanks for releasing a new version. You can see it at"
echo "https://atmospherejs.com/${PACKAGE_NAME/://}"
else
echo "We got an error. Please post it at https://github.com/raix/Meteor-community-discussions/issues/14"
fi
# rm the temporary build files and package.js
rm -rf ".build.$PACKAGE_NAME" versions.json package.js
done
exit $ALL_EXIT_CODE

8
meteor/runtests.bat

@ -0,0 +1,8 @@
REM Test Meteor package before publishing to Atmospherejs.com
@echo off
REM Sanity check: make sure we're in the directory of the script
set DIR=%~dp0
cd %DIR%
meteor test-packages ./ %*

41
meteor/runtests.sh

@ -5,8 +5,8 @@
# The curl'ed script is totally safe; takes 2 minutes to read its source and check. # The curl'ed script is totally safe; takes 2 minutes to read its source and check.
type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; } type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; }
# sanity check: make sure we're in the root directory of the checkout # sanity check: make sure we're in the directory of the script
cd "$( dirname "$0" )/.." cd "$( dirname "$0" )"
# delete the temporary files even if Ctrl+C is pressed # delete the temporary files even if Ctrl+C is pressed
@ -16,31 +16,20 @@ int_trap() {
trap int_trap INT trap int_trap INT
ALL_EXIT_CODE=0 EXIT_CODE=0
# test any package*.js packages we may have, e.g. package.js, package-standalone.js PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2)
for PACKAGE_FILE in meteor/package*.js; do
# Meteor expects package.js in the root dir of the checkout, so copy there our package file under that name, temporarily echo "### Testing $PACKAGE_NAME..."
cp $PACKAGE_FILE ./package.js
PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2) # provide an invalid MONGO_URL so Meteor doesn't bog us down with an empty Mongo database
if [ $# -gt 0 ]; then
# interpret any parameter to mean we want an interactive test
MONGO_URL=mongodb:// meteor test-packages ./
else
# automated/CI test with phantomjs
./node_modules/.bin/spacejam --mongo-url mongodb:// test-packages ./
EXIT_CODE=$(( $EXIT_CODE + $? ))
fi
echo "### Testing $PACKAGE_NAME..." exit $EXIT_CODE
# provide an invalid MONGO_URL so Meteor doesn't bog us down with an empty Mongo database
if [ $# -gt 0 ]; then
# interpret any parameter to mean we want an interactive test
MONGO_URL=mongodb:// meteor test-packages ./
else
# automated/CI test with phantomjs
./node_modules/.bin/spacejam --mongo-url mongodb:// test-packages ./
ALL_EXIT_CODES=$(( $ALL_EXIT_CODES + $? ))
fi
# delete temporary build files and package.js
rm -rf .build.* versions.json package.js
done
exit $ALL_EXIT_CODES

Loading…
Cancel
Save