js2 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/js2/js2.js +112 -92
  2. metadata +7 -17
data/lib/js2/js2.js CHANGED
@@ -139,7 +139,7 @@ function mainFunction (arg) {
139
139
  };
140
140
 
141
141
  var assert = {
142
- 'eq': function(val, expected) { if (expected != val) console.log("Expected "+expected+", but got "+val+".") },
142
+ 'eq': function(expected, actual) { if (expected != actual) console.log("Expected "+expected+", but got "+actual+".") },
143
143
  'isFalse': function(val) { if (val) console.log("Expected false, but got "+val+".") },
144
144
  'isTrue': function(val) { if (!val) console.log("Expected true, but got " +val+".") }
145
145
  };
@@ -927,13 +927,25 @@ JS2.Array.prototype.until = function(f) {
927
927
 
928
928
 
929
929
  JS2.Array.prototype.collect = function(f) {
930
- var ret = new JS2.Array();
931
- this.each(function($1,$2,$3){ ret.push(f.call(this, $1, $2)) });
930
+ var ret = new JS2.Array();
931
+ var self = this;
932
+ this.each(function($1,$2,$3){ ret.push(f.call(self, $1, $2)) });
932
933
  return ret;
933
934
  };
934
935
 
936
+ // http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reduce
935
937
  JS2.Array.prototype.reduce = function(f, val) {
936
- this.each(function($1,$2,$3){ val = f.call(this, $1, val) });
938
+ if (this.length == 0) return val;
939
+ if (this.length == 1) return val == null ? f(this[0]) : f(val, this[0]);
940
+
941
+ var i = 0;
942
+ if (val == null) val = this[i++];
943
+
944
+ for (var n=this.length;i<n;i++) {
945
+ val = f(val, this[i]);
946
+ }
947
+
948
+ return val;
937
949
  };
938
950
 
939
951
  JS2.Array.prototype.reject = function(f) {
@@ -943,7 +955,8 @@ JS2.Array.prototype.reject = function(f) {
943
955
  } else if (typeof f == 'string' || typeof f == 'number') {
944
956
  this.each(function($1,$2,$3){ if ($1 != f) ret.push($1) });
945
957
  } else if (typeof f == 'function') {
946
- this.each(function($1,$2,$3){ if (!f.call(this, $1, $2)) ret.push($1) });
958
+ var self = this;
959
+ this.each(function($1,$2,$3){ if (!f.call(self, $1, $2)) ret.push($1) });
947
960
  }
948
961
  return ret;
949
962
  };
@@ -955,7 +968,8 @@ JS2.Array.prototype.select = function(f) {
955
968
  } else if (typeof f == 'string' || typeof f == 'number') {
956
969
  this.each(function($1,$2,$3){ if ($1 == f) ret.push($1) });
957
970
  } else if (typeof f == 'function') {
958
- this.each(function($1,$2,$3){ if (f.call(this, $1, $2)) ret.push($1) });
971
+ var self = this;
972
+ this.each(function($1,$2,$3){ if (f.call(self, $1, $2)) ret.push($1) });
959
973
  }
960
974
  return ret;
961
975
  };
@@ -973,16 +987,17 @@ JS2.Array.prototype.any = function() {
973
987
  return this.length > 0;
974
988
  };
975
989
 
976
- JS2.Class.extend('FileSystem', {
977
- initialize:function (adapter) {
990
+
991
+ JS2.Class.extend('FileSystem', function(KLASS, OO){
992
+ OO.addMember("initialize",function (adapter) {
978
993
  this.adapter = adapter;
979
- },
994
+ });
980
995
 
981
- find:function (dir, ext, recursive) {
996
+ OO.addMember("find",function (dir, ext, recursive) {
982
997
  return this._find(this.expandPath(dir), new RegExp('\\.' + ext + '$'), recursive);
983
- },
998
+ });
984
999
 
985
- _find:function (dir, regex, recursive) {
1000
+ OO.addMember("_find",function (dir, regex, recursive) {
986
1001
  if (!this.isDirectory(dir)) return [];
987
1002
 
988
1003
  var parts = this.adapter.readdir(dir);
@@ -1003,15 +1018,15 @@ JS2.Class.extend('FileSystem', {
1003
1018
  });
1004
1019
 
1005
1020
  return files;
1006
- },
1021
+ });
1007
1022
 
1008
- canonical:function (file) {
1023
+ OO.addMember("canonical",function (file) {
1009
1024
  var abs = this.expandPath(file);
1010
1025
  abs = abs.replace(/\/$/, '');
1011
1026
  return abs;
1012
- },
1027
+ });
1013
1028
 
1014
- mkpath:function (file) {
1029
+ OO.addMember("mkpath",function (file) {
1015
1030
  var dirname = this.canonical(this.dirname(file));
1016
1031
 
1017
1032
  var subdirs = js2(dirname.split('/'));
@@ -1023,83 +1038,84 @@ JS2.Class.extend('FileSystem', {
1023
1038
  toMake += '/' + $1;
1024
1039
  self.mkdir(toMake);
1025
1040
  });
1026
- },
1041
+ });
1027
1042
 
1028
1043
  // ADAPTER USAGE
1029
- dirname:function (file) {
1044
+ OO.addMember("dirname",function (file) {
1030
1045
  return this.adapter.dirname(file);
1031
- },
1046
+ });
1032
1047
 
1033
- readdir:function (file) {
1048
+ OO.addMember("readdir",function (file) {
1034
1049
  return this.adapter.readdir(file);
1035
- },
1050
+ });
1036
1051
 
1037
- read:function (file) {
1052
+ OO.addMember("read",function (file) {
1038
1053
  var data = this.adapter.read(file);
1039
1054
  return data;
1040
- },
1055
+ });
1041
1056
 
1042
- write:function (file, data) {
1057
+ OO.addMember("write",function (file, data) {
1043
1058
  return this.adapter.write(file, data);
1044
- },
1059
+ });
1045
1060
 
1046
- mtime:function (file) {
1061
+ OO.addMember("mtime",function (file) {
1047
1062
  return this.adapter.mtime(file);
1048
- },
1063
+ });
1049
1064
 
1050
- exists:function (file) {
1065
+ OO.addMember("exists",function (file) {
1051
1066
  return this.isDirectory(file) || this.isFile(file);
1052
- },
1067
+ });
1053
1068
 
1054
- mkdir:function (file) {
1069
+ OO.addMember("mkdir",function (file) {
1055
1070
  if (!this.exists(file)) {
1056
1071
  return this.adapter.mkdir(file);
1057
1072
  }
1058
- },
1073
+ });
1059
1074
 
1060
- isFile:function (file) {
1075
+ OO.addMember("isFile",function (file) {
1061
1076
  try {
1062
1077
  return this.adapter.isFile(file);
1063
1078
  } catch(e) {
1064
1079
  return false;
1065
1080
  }
1066
- },
1081
+ });
1067
1082
 
1068
- setInterval:function (code, interval) {
1083
+ OO.addMember("setInterval",function (code, interval) {
1069
1084
  return this.adapter.setInterval(code, interval);
1070
- },
1085
+ });
1071
1086
 
1072
- isDirectory:function (file) {
1087
+ OO.addMember("isDirectory",function (file) {
1073
1088
  try {
1074
1089
  return this.adapter.isDirectory(file);
1075
1090
  } catch(e) {
1076
1091
  return false;
1077
1092
  }
1078
- },
1093
+ });
1079
1094
 
1080
- expandPath:function (file) {
1095
+ OO.addMember("expandPath",function (file) {
1081
1096
  return this.adapter.expandPath(file);
1082
- }
1097
+ });
1083
1098
  });
1084
1099
 
1085
- JS2.Class.extend('Updater', {
1086
- initialize:function (fs, inDir, outDir, recursive) {
1100
+
1101
+ JS2.Class.extend('Updater', function(KLASS, OO){
1102
+ OO.addMember("initialize",function (fs, inDir, outDir, recursive) {
1087
1103
  this.recursive = recursive;
1088
1104
  this.fs = fs;
1089
1105
  this.inDir = this.fs.canonical(inDir);
1090
1106
  this.outDir = this.fs.canonical(outDir);
1091
1107
  this.verbose = true;
1092
- },
1108
+ });
1093
1109
 
1094
- update:function (force, funct) {
1110
+ OO.addMember("update",function (force, funct) {
1095
1111
  var self = this;
1096
1112
  this.matchDirs(this.inDir);
1097
1113
  this.fs.find(this.inDir, 'js2', this.recursive).each(function($1,$2,$3){
1098
1114
  self.tryUpdate($1, force, funct);
1099
1115
  });
1100
- },
1116
+ });
1101
1117
 
1102
- matchDirs:function (dir) {
1118
+ OO.addMember("matchDirs",function (dir) {
1103
1119
  var subs = this.fs.readdir(dir);
1104
1120
  for(var _i4=0,_c4=subs,_l4=_c4.length,sub;sub=_c4[_i4]||_i4<_l4;_i4++){
1105
1121
  var path = dir + '/' + sub;
@@ -1108,9 +1124,9 @@ JS2.Class.extend('Updater', {
1108
1124
  this.matchDirs(path);
1109
1125
  }
1110
1126
  }
1111
- },
1127
+ });
1112
1128
 
1113
- tryUpdate:function (file, force, funct) {
1129
+ OO.addMember("tryUpdate",function (file, force, funct) {
1114
1130
  var outFile = file.replace(this.inDir, this.outDir).replace(/\.js2$/, '.js');
1115
1131
 
1116
1132
  var dir = this.fs.dirname(file);
@@ -1123,18 +1139,19 @@ JS2.Class.extend('Updater', {
1123
1139
  this.fs.write(outFile, JS2(this.fs.read(file)));
1124
1140
  }
1125
1141
  }
1126
- }
1142
+ });
1127
1143
  });
1128
1144
 
1129
- JS2.Class.extend('Config', {
1130
- "CLI_REGEX":/^-(r|i|f)(=(\w+))$/,
1131
- "optsLookup":{
1145
+
1146
+ JS2.Class.extend('Config', function(KLASS, OO){
1147
+ OO.addMember("CLI_REGEX",/^-(r|i|f)(=(\w+))$/);
1148
+ OO.addMember("optsLookup",{
1132
1149
  'n': 'non-recursive',
1133
1150
  'i': 'interval',
1134
1151
  'f': 'format'
1135
- },
1152
+ });
1136
1153
 
1137
- initialize:function (fs, argv) {
1154
+ OO.addMember("initialize",function (fs, argv) {
1138
1155
  this.format = 'browser';
1139
1156
  this.recursive = true;
1140
1157
  this.interval = 2;
@@ -1164,9 +1181,9 @@ JS2.Class.extend('Config', {
1164
1181
 
1165
1182
  this.recursive = !this['non-recursive'];
1166
1183
  this.interval = parseInt(this.interval);
1167
- },
1184
+ });
1168
1185
 
1169
- loadConfigFile:function (file) {
1186
+ OO.addMember("loadConfigFile",function (file) {
1170
1187
  if (this.fs.isFile(file)) {
1171
1188
  try {
1172
1189
  var config = JSON.parse(this.fs.read(file).replace(/\n\r?/g, ''));
@@ -1184,12 +1201,13 @@ JS2.Class.extend('Config', {
1184
1201
  }
1185
1202
  }
1186
1203
  return false;
1187
- }
1204
+ });
1188
1205
 
1189
1206
  });
1190
1207
 
1191
- JS2.Class.extend('Commander', {
1192
- "BANNER":"js2 <command> [options] <arguments>\n" +
1208
+
1209
+ JS2.Class.extend('Commander', function(KLASS, OO){
1210
+ OO.addMember("BANNER","js2 <command> [options] <arguments>\n" +
1193
1211
  "Commands:\n" +
1194
1212
  " * run <file> -- Executes file\n" +
1195
1213
  " * render <file> -- Shows JS2 compiled output\n" +
@@ -1202,14 +1220,14 @@ JS2.Class.extend('Commander', {
1202
1220
  " Options:\n" +
1203
1221
  " -n -- Do NOT traverse directories recursively\n" +
1204
1222
  " -f=<format> -- Compile for different formats: node, ringo, or browser\n" +
1205
- " -i=<seconds> -- Interval time in seconds between loops\n",
1223
+ " -i=<seconds> -- Interval time in seconds between loops\n");
1206
1224
 
1207
- "DEFAULT_CONFIG":{
1225
+ OO.addMember("DEFAULT_CONFIG",{
1208
1226
  compile: { inDir: 'src', outDir: 'lib', recursive: true, decorator: 'Node' },
1209
1227
  watch: { inDir: 'src', outDir: 'lib', recursive: true, decorator: 'Node' }
1210
- },
1228
+ });
1211
1229
 
1212
- initialize:function (argv) {
1230
+ OO.addMember("initialize",function (argv) {
1213
1231
  this.fs = JS2.fs;
1214
1232
  this.config = new JS2.Config(this.fs, argv);
1215
1233
  this.command = this.config.command;
@@ -1219,40 +1237,40 @@ JS2.Class.extend('Commander', {
1219
1237
  case 'node': JS2.DECORATOR = new JS2.NodeDecorator(); break;
1220
1238
  default: JS2.DECORATOR = new JS2.BrowserDecorator(); break;
1221
1239
  }
1222
- },
1240
+ });
1223
1241
 
1224
- cli:function () {
1242
+ OO.addMember("cli",function () {
1225
1243
  if (this[this.command]) {
1226
1244
  this[this.command]();
1227
1245
  } else {
1228
1246
  this.showBanner();
1229
1247
  }
1230
- },
1248
+ });
1231
1249
 
1232
- render:function () {
1250
+ OO.addMember("render",function () {
1233
1251
  console.log(js2.render(this.fs.read(this.config.args[0])));
1234
- },
1252
+ });
1235
1253
 
1236
- run:function () {
1254
+ OO.addMember("run",function () {
1237
1255
  var file;
1238
1256
  var i = 0;
1239
1257
  while (file = this.config.args[i++]) {
1240
1258
  eval(js2.render(this.fs.read(file)));
1241
1259
  }
1242
- },
1260
+ });
1243
1261
 
1244
- compile:function () {
1262
+ OO.addMember("compile",function () {
1245
1263
  var self = this;
1246
1264
  this.getUpdater().update(true, function($1,$2,$3){ return JS2.DECORATOR.file($1); });
1247
- },
1265
+ });
1248
1266
 
1249
- getUpdater:function () {
1267
+ OO.addMember("getUpdater",function () {
1250
1268
  var inDir = this.config.args[0] || this.config.sourceDir || '.';
1251
1269
  var outDir = this.config.args[1] || this.config.outDir || inDir;
1252
1270
  return new JS2.Updater(this.fs, inDir, outDir, this.config.recursive);
1253
- },
1271
+ });
1254
1272
 
1255
- watch:function () {
1273
+ OO.addMember("watch",function () {
1256
1274
  var updater = this.getUpdater();
1257
1275
  var self = this;
1258
1276
  var interval = this.config.interval || 2;
@@ -1262,47 +1280,49 @@ JS2.Class.extend('Commander', {
1262
1280
  // HACK to get this integrated with ruby
1263
1281
  updater.update();
1264
1282
  setInterval(function($1,$2,$3){ console.log('updating'); updater.update(true, function($1,$2,$3){ return JS2.DECORATOR.file($1); }); }, interval * 1000);
1265
- },
1283
+ });
1266
1284
 
1267
- showBanner:function () {
1285
+ OO.addMember("showBanner",function () {
1268
1286
  console.log(this.BANNER);
1269
- }
1287
+ });
1270
1288
  });
1271
1289
 
1272
1290
 
1273
- JS2.Class.extend('BrowserDecorator', {
1274
- file:function (code) {
1291
+
1292
+ JS2.Class.extend('BrowserDecorator', function(KLASS, OO){
1293
+ OO.addMember("file",function (code) {
1275
1294
  return code;
1276
- },
1295
+ });
1277
1296
 
1278
- klass:function (name, par, source) {
1297
+ OO.addMember("klass",function (name, par, source) {
1279
1298
  return par+".extend('"+name+"',"+source+");";
1280
- }
1299
+ });
1281
1300
  });
1282
1301
 
1283
- JS2.Class.extend('NodeDecorator', {
1284
- file:function (code) {
1302
+ JS2.Class.extend('NodeDecorator', function(KLASS, OO){
1303
+ OO.addMember("file",function (code) {
1285
1304
  return "var js2 = require('js2').js2;\nvar JS2 = js2;\n" + code;
1286
- },
1305
+ });
1287
1306
 
1288
- klass:function (name, par, source) {
1307
+ OO.addMember("klass",function (name, par, source) {
1289
1308
  return "var "+name+"=exports['"+name+"']="+par+".extend("+source+");";
1290
- }
1309
+ });
1291
1310
  });
1292
1311
 
1293
- JS2.Class.extend('RingoDecorator', {
1294
- file:function (code) {
1312
+ JS2.Class.extend('RingoDecorator', function(KLASS, OO){
1313
+ OO.addMember("file",function (code) {
1295
1314
  return "var js2 = require('js2').js2;\nvar JS2 = js2;\n" + code;
1296
- },
1315
+ });
1297
1316
 
1298
- klass:function (name, par, source) {
1317
+ OO.addMember("klass",function (name, par, source) {
1299
1318
  return "var "+name+"=exports['"+name+"']="+par+".extend("+source+");";
1300
- }
1319
+ });
1301
1320
  });
1302
1321
 
1303
1322
  JS2.DECORATOR = JS2.DECORATOR || new JS2.BrowserDecorator();
1304
1323
 
1305
1324
 
1325
+
1306
1326
  JS2.fs = new JS2.FileSystem(JS2_RUBY_FILE_ADAPTER);
1307
1327
  js2.DECORATOR = new JS2.BrowserDecorator();
1308
1328
  js2.ROOT = root;
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js2
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 3
8
- - 3
9
- version: 0.3.3
4
+ prerelease:
5
+ version: 0.3.4
10
6
  platform: ruby
11
7
  authors:
12
8
  - Jeff Su
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-03-09 00:00:00 -08:00
13
+ date: 2011-03-10 00:00:00 +08:00
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
@@ -25,8 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ">="
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
24
  version: "0"
31
25
  type: :runtime
32
26
  version_requirements: *id001
@@ -42,11 +36,11 @@ extra_rdoc_files: []
42
36
  files:
43
37
  - bin/js2
44
38
  - bin/js2-ruby
45
- - lib/js2/command.rb
39
+ - lib/js2.rb
46
40
  - lib/js2/context.rb
47
- - lib/js2/fs.rb
48
41
  - lib/js2/rack.rb
49
- - lib/js2.rb
42
+ - lib/js2/command.rb
43
+ - lib/js2/fs.rb
50
44
  - lib/js2/js2.js
51
45
  - CHANGELOG
52
46
  has_rdoc: true
@@ -63,21 +57,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
63
57
  requirements:
64
58
  - - ">="
65
59
  - !ruby/object:Gem::Version
66
- segments:
67
- - 0
68
60
  version: "0"
69
61
  required_rubygems_version: !ruby/object:Gem::Requirement
70
62
  none: false
71
63
  requirements:
72
64
  - - ">="
73
65
  - !ruby/object:Gem::Version
74
- segments:
75
- - 0
76
66
  version: "0"
77
67
  requirements: []
78
68
 
79
69
  rubyforge_project:
80
- rubygems_version: 1.3.7
70
+ rubygems_version: 1.5.2
81
71
  signing_key:
82
72
  specification_version: 3
83
73
  summary: Javascript Syntactic Sugar