js2 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
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