mochiscript 0.4.0.pre1 → 0.4.0.pre10

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in mochiscript.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/mochiscript.rb CHANGED
@@ -2,7 +2,7 @@ require 'v8'
2
2
  require 'json'
3
3
 
4
4
  module Mochiscript
5
- VERSION = "0.4.0-pre1".sub("-", '.')
5
+ VERSION = "0.4.0-pre10".sub("-", '.')
6
6
  class Context
7
7
  def initialize
8
8
  @ctx = V8::Context.new
@@ -238,16 +238,17 @@ var JS2 = $m;
238
238
  return $m;
239
239
  })(undefined, $m);
240
240
 
241
+
241
242
  var IDENT = "[\\$\\w]+";
242
243
  var TOKENS = [
243
244
  [ "SPACE", "\\s+" ],
244
245
 
246
+ [ "STATIC", "static\\b" ],
245
247
  [ "MODULE", "module\\b", 'ModuleParser' ],
246
248
  [ "CLASS", "class\\b", 'ClassParser' ],
247
249
  [ "FUNCTION", "function\\b" ],
248
250
  [ "INCLUDE", "include\\b" ],
249
251
  [ "VAR", "var\\b" ],
250
- [ "STATIC", "static\\b" ],
251
252
  [ "PRIVATE", "private\\b" ],
252
253
  [ "EXTENDS", "extends\\b" ],
253
254
  [ "FOREACH", "foreach\\b", 'ForeachParser' ],
@@ -264,6 +265,7 @@ var TOKENS = [
264
265
  [ "EQUALS", "=" ],
265
266
 
266
267
  [ "COMMENT", "\\/\\/|\\/\\*", "CommentParser" ],
268
+ [ "REGEX", "/", 'RegexParser' ],
267
269
 
268
270
  [ "LBRACE", "\\(" ],
269
271
  [ "RBRACE", "\\)" ],
@@ -296,6 +298,7 @@ JS2.Class.extend('Tokens', function(KLASS, OO){
296
298
  this.orig = str;
297
299
  this.str = str;
298
300
  this.iterator = 0;
301
+ this.consumed = 0;
299
302
  });
300
303
 
301
304
  OO.addMember("peek",function () {
@@ -320,8 +323,26 @@ JS2.Class.extend('Tokens', function(KLASS, OO){
320
323
  OO.addMember("consume",function (n) {
321
324
  this.str = this.str.substr(n, this.str.length-n);
322
325
  this._peek = null;
326
+ this.consumed += n;
327
+ });
328
+
329
+ OO.addMember("length",function () {
330
+ return this.str.length;
331
+ });
332
+
333
+ OO.addMember("lookback",function (n) {
334
+ var starting = this.consumed;
335
+ while (this.orig.charAt(starting).match(/\s/)) starting--;
336
+ return this.orig.substr(starting-1-n, n);
337
+ });
338
+
339
+ OO.addMember("lookahead",function (n) {
340
+ var starting = this.consumed;
341
+ while (this.orig.charAt(starting).match(/\s/)) starting++;
342
+ return this.orig.substr(starting, n);
323
343
  });
324
344
 
345
+
325
346
  OO.addMember("any",function () {
326
347
  return this.str.length > 0;
327
348
  });
@@ -332,6 +353,7 @@ JS2.Class.extend('Tokens', function(KLASS, OO){
332
353
  });
333
354
  var Tokens = $c.Tokens;
334
355
 
356
+
335
357
  $m.parse = function (str) {
336
358
  var parser = new $c.RootParser();
337
359
  parser.parse(new $c.Tokens(str));
@@ -347,31 +369,44 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
347
369
  });
348
370
 
349
371
  OO.addMember("parse",function (tokens) {
350
- this.startParse(tokens);
372
+ var len = tokens.length();
373
+ if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false
374
+ return len != tokens.length();
375
+ });
376
+
377
+ OO.addMember("parseTokens",function (tokens) {
378
+ var sanity = 100;
379
+ var origLen = tokens.length();
351
380
 
352
- var sanity = 100;
353
381
  while (tokens.any()) {
354
- var origLen = tokens.length;
355
- var token = tokens.peek();
382
+ var token = tokens.peek();
356
383
  if (!token) break;
384
+
385
+ // has a parser class associated with this token
357
386
  var handlerClass = this.getHandler(token) || token[2];
358
387
  if (handlerClass) {
359
388
  var handler = new $c[handlerClass];
360
- handler.parse(tokens);
361
- this.out.push(handler);
362
- } else {
389
+ if (handler.parse(tokens) !== false) {
390
+ this.out.push(handler);
391
+ tokens.lastHandler = handler;
392
+ } else {
393
+ this.handleToken(token, tokens);
394
+ }
395
+ }
396
+
397
+ // no parser class, use "this" to just consume it
398
+ else {
363
399
  this.handleToken(token, tokens);
364
400
  }
401
+
365
402
  if (this.finished) break;
366
403
 
367
- if (origLen == tokens.length && sanity-- == 0) {
404
+ if (origLen == tokens.length() && sanity-- == 0) {
368
405
  throw "parse error";
369
406
  } else {
370
407
  sanity = 100;
371
408
  }
372
409
  }
373
-
374
- this.endParse(tokens);
375
410
  });
376
411
 
377
412
  OO.addMember("startParse",function () { });
@@ -390,6 +425,7 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
390
425
  return ret.join("");
391
426
  });
392
427
 
428
+ // intercepts parser class for special cases
393
429
  OO.addMember("getHandler",function (token) {
394
430
  return null;
395
431
  });
@@ -430,7 +466,8 @@ RootParser.extend('ModuleParser', function(KLASS, OO){
430
466
 
431
467
  OO.addMember("parse",function (tokens) {
432
468
  var m = tokens.match(REGEX);
433
- var name = m[2];
469
+ if (!m) return false;
470
+ var name = m[2];
434
471
  tokens.consume(m[0].length-1);
435
472
 
436
473
  var content = new $c.ClassContentParser();
@@ -471,10 +508,11 @@ var CurlyParser = $c.CurlyParser;
471
508
  CurlyParser.extend('ClassContentParser', function(KLASS, OO){
472
509
  OO.addMember("getHandler",function (token) {
473
510
  switch(token[0]) {
474
- case TYPES.VAR: return "MemberParser";
511
+ case TYPES.STATIC: return "StaticParser";
512
+ case TYPES.VAR: return "MemberParser";
475
513
  case TYPES.FUNCTION: return "MethodParser";
476
- case TYPES.PRIVATE: return "PrivateParser";
477
- case TYPES.INCLUDE: return "IncludeParser";
514
+ case TYPES.PRIVATE: return "PrivateParser";
515
+ case TYPES.INCLUDE: return "IncludeParser";
478
516
  }
479
517
  });
480
518
 
@@ -547,6 +585,35 @@ RootParser.extend('IStringParser', function(KLASS, OO){
547
585
  });
548
586
  });
549
587
 
588
+ RootParser.extend('StaticParser', function(KLASS, OO){
589
+ // private closure
590
+
591
+ var VAR_REGEX = Tokens.regex("(<STATIC>(\\s+))<VAR>");
592
+ var FUNCT_REGEX = Tokens.regex("(<STATIC>(\\s+))<FUNCTION>");
593
+
594
+
595
+ OO.addMember("parseTokens",function (tokens) {
596
+ var varMatch = tokens.match(VAR_REGEX);
597
+ if (varMatch) {
598
+ tokens.consume(varMatch[1].length);
599
+ var parser = new MemberParser();
600
+ parser.isStatic = true;
601
+ parser.parse(tokens);
602
+ this.out.push(parser);
603
+ }
604
+
605
+ else {
606
+ var functMatch = tokens.match(FUNCT_REGEX);
607
+ tokens.consume(functMatch[1].length);
608
+
609
+ var parser = new MethodParser();
610
+ parser.isStatic = true;
611
+ parser.parse(tokens);
612
+ this.out.push(parser);
613
+ }
614
+ });
615
+ });
616
+
550
617
  RootParser.extend('MemberParser', function(KLASS, OO){
551
618
  // private closure
552
619
 
@@ -561,11 +628,14 @@ RootParser.extend('MemberParser', function(KLASS, OO){
561
628
  var parser = new $c.LineParser();
562
629
  parser.parse(tokens);
563
630
  parser.chop();
631
+ var addMethod = this.isStatic ? 'addStaticMember' : 'addMember';
564
632
 
565
- this.out = [ "OO.addMember(", JSON.stringify(this.name), ",", parser, ");" ];
633
+ this.out = [ "OO." + addMethod + "(", JSON.stringify(this.name), ",", parser, ");" ];
566
634
  });
567
635
  });
568
636
 
637
+
638
+
569
639
  RootParser.extend('IncludeParser', function(KLASS, OO){
570
640
  // private closure
571
641
 
@@ -615,13 +685,16 @@ RootParser.extend('MethodParser', function(KLASS, OO){
615
685
  OO.addMember("parse",function (tokens) {
616
686
  var m = tokens.str.match(REGEX);
617
687
  tokens.consume(m[0].length);
618
- this.name = m[2];
619
- this.args = m[3];
620
- this.body = new CurlyParser();
621
- this.body.foo = true;
622
- this.body.parse(tokens);
688
+ var name = m[2];
689
+ var args = m[3];
690
+
691
+ var body = new CurlyParser();
692
+ body.parse(tokens);
693
+
694
+ var addMethod = this.isStatic ? 'addStaticMember' : 'addMember';
695
+
623
696
 
624
- this.out = [ 'OO.addMember(', JSON.stringify(this.name), ', function', this.args, this.body, ');' ];
697
+ this.out = [ 'OO.' + addMethod + '(', JSON.stringify(name), ', function', args, body, ');' ];
625
698
  });
626
699
  });
627
700
 
@@ -660,13 +733,42 @@ RootParser.extend('CommentParser', function(KLASS, OO){
660
733
  return;
661
734
  }
662
735
 
663
- var m2 = tokens.match(/^\/\*.*?\*\//);
736
+ var m2 = tokens.match(/^\/\*[\s\S]*?\*\//);
664
737
  if (m2) {
665
738
  tokens.consume(m2[0].length);
666
739
  this.out = [ m2[0] ];
667
740
  return;
741
+ }
742
+
743
+ return false;
744
+ });
745
+ });
746
+
747
+ RootParser.extend('RegexParser', function(KLASS, OO){
748
+ // private closure
749
+
750
+ var REGEX = /^\/(\\.|[^\/])+\/[imgy]{0,4}/;
751
+ var DIVIDE = /(\}|\)|\+\+|\-\-|[\w\$])$/;
752
+
753
+
754
+ OO.addMember("parseTokens",function (tokens) {
755
+ var back = tokens.lookback(2);
756
+ if (back.match(DIVIDE)) {
757
+ tokens.consume(1);
758
+ this.out.push("/");
759
+ }
760
+
761
+ else {
762
+ var m = tokens.match(REGEX);
763
+ if (m) {
764
+ this.out.push(m[0]);
765
+ tokens.consume(m[0].length);
766
+ } else {
767
+ return false;
768
+ }
668
769
  }
669
770
  });
771
+
670
772
  });
671
773
 
672
774
  CurlyParser.extend('ForeachParser', function(KLASS, OO){
@@ -685,7 +787,7 @@ CurlyParser.extend('ForeachParser', function(KLASS, OO){
685
787
 
686
788
  // TODO ugly, revisit this later
687
789
  tokens.consume(m[0].length-1);
688
- var declare = [ this.iterator + "=0", this.item + "=null", "_list_" + namespace + "=" + this.list, "_len_" + namespace + "=_list_.length" ].join(',');
790
+ var declare = [ this.iterator + "=0", this.item + "=null", "_list_" + namespace + "=" + this.list, "_len_" + namespace + "=_list_" + namespace + ".length" ].join(',');
689
791
 
690
792
  var bool = "(" + this.item + "=" + "_list_" + namespace + "[" + this.iterator + "])||" + this.iterator + "<_len_" + namespace;
691
793
 
@@ -698,6 +800,254 @@ CurlyParser.extend('ForeachParser', function(KLASS, OO){
698
800
 
699
801
  });
700
802
 
803
+
804
+ JS2.Class.extend('JSML', function(KLASS, OO){
805
+ OO.addStaticMember("process",function (txt) {
806
+ return new KLASS(txt);
807
+ });
808
+
809
+ OO.addMember("initialize",function (txt) {
810
+ var lines = txt.split(/\n/);
811
+ this.root = new JS2.JSMLElement();
812
+ this.stack = [ this.root ];
813
+
814
+ for(var _i1=0,_c1=lines,_l1=_c1.length,l;(l=_c1[_i1])||(_i1<_l1);_i1++){
815
+ if (l.match(/^\s*$/)) continue;
816
+ this.processLine(l);
817
+ }
818
+
819
+ var toEval = 'function process() { var out = [];\n' + this.flatten().join('') + '\n return out.join("");\n}';
820
+ eval(toEval);
821
+
822
+ this.result = function(bound) {
823
+ bound = bound || {};
824
+ return process.call(bound);
825
+ };
826
+ });
827
+
828
+ OO.addMember("flatten",function () {
829
+ return this.root.flatten();
830
+ });
831
+
832
+ OO.addMember("processLine",function (line) {
833
+ if (line.match(/^\s*$/)) return;
834
+
835
+ var ele = new JS2.JSMLElement(line);
836
+ var scope = this.getScope();
837
+
838
+ if (ele.scope == scope) {
839
+ this.stack.pop();
840
+ this.getLast().push(ele);
841
+ this.stack.push(ele);
842
+ } else if (ele.scope > scope) {
843
+ this.getLast().push(ele);
844
+ this.stack.push(ele);
845
+ } else if (ele.scope < scope) {
846
+ var diff = scope - ele.scope + 1;
847
+ while(diff-- > 0) {
848
+ this.stack.pop();
849
+ }
850
+ this.getLast().push(ele);
851
+ this.stack.push(ele);
852
+ }
853
+ });
854
+
855
+
856
+ OO.addMember("getScope",function () {
857
+ return this.stack.length - 1;
858
+ });
859
+
860
+ OO.addMember("getLast",function () {
861
+ return this.stack[this.stack.length-1];
862
+ });
863
+
864
+ });
865
+
866
+ JS2.Class.extend('JSMLElement', function(KLASS, OO){
867
+ OO.addMember("SCOPE_REGEX",/^(\s*)(.*)$/);
868
+ OO.addMember("SPLIT_REGEX",/^((?:\.|\#|\%)[^=\s\{]*)?(\{.*\})?(=|-)?(?:\s*)(.*)$/);
869
+ OO.addMember("TOKEN_REGEX",/(\%|\#|\.)([\w][\w\-]*)/g);
870
+ OO.addMember("JS_REGEX",/^(-|=)(.*)$/g);
871
+ OO.addMember("SCOPE_OFFSET",1);
872
+ OO.addMember("SELF_CLOSING",{ area: null, basefont: null, br: null, hr: null, input: null, img: null, link: null, meta: null });
873
+
874
+ OO.addMember("initialize",function (line) {
875
+ this.children = [];
876
+
877
+ if (line == null) {
878
+ this.scope = this.SCOPE_OFFSET;
879
+ return;
880
+ }
881
+
882
+ var spaceMatch = line.match(this.SCOPE_REGEX);
883
+ this.scope = spaceMatch[1].length / 2 + this.SCOPE_OFFSET;
884
+
885
+ this.classes = [];
886
+ this.nodeID = null;
887
+
888
+ this.parse(spaceMatch[2]);
889
+ });
890
+
891
+ OO.addMember("push",function (child) {
892
+ this.children.push(child);
893
+ });
894
+
895
+ OO.addMember("parse",function (line) {
896
+ this.attributes;
897
+ this.line = line;
898
+ var self = this;
899
+
900
+ var splitted = line.match(this.SPLIT_REGEX);
901
+ var tokens = splitted[1];
902
+ var attrs = splitted[2];
903
+ var jsType = splitted[3];
904
+ var content = splitted[4];
905
+
906
+ if (tokens) {
907
+ tokens.replace(this.TOKEN_REGEX, function(match, type, name){
908
+ switch(type) {
909
+ case '%': self.nodeType = name; break;
910
+ case '.': self.classes.push(name); break;
911
+ case '#': self.nodeID = name; break;
912
+ }
913
+ return '';
914
+ });
915
+ }
916
+
917
+ if (jsType == '=') {
918
+ this.jsEQ = content;
919
+ } else if (jsType == '-') {
920
+ this.jsExec = content;
921
+ } else {
922
+ this.content = content;
923
+ }
924
+
925
+ if (attrs) {
926
+ this.attributes = attrs;
927
+ }
928
+
929
+ if (!this.nodeType && (this.classes.length || this.nodeID)) {
930
+ this.nodeType = 'div';
931
+ }
932
+
933
+ if (this.SELF_CLOSING.hasOwnProperty(this.nodeType) && this.children.length == 0) {
934
+ this.selfClose = '/';
935
+ } else {
936
+ this.selfClose = '';
937
+ }
938
+ });
939
+
940
+ OO.addMember("flatten",function () {
941
+ var out = [];
942
+
943
+ for(var _i1=0,_c1=this.children,_l1=_c1.length,c;(c=_c1[_i1])||(_i1<_l1);_i1++){
944
+ var arr = c.flatten();
945
+ for(var _i2=0,_c2=arr,_l2=_c2.length,item;(item=_c2[_i2])||(_i2<_l2);_i2++){
946
+ out.push(item);
947
+ }
948
+ }
949
+
950
+ if (this.nodeType) {
951
+ this.handleJsEQ(out);
952
+ this.handleContent(out);
953
+ out.unshift('out.push("<' + this.nodeType + '"+JS2.JSMLElement.parseAttributes(' + (this.attributes || "{}") + ', ' + JSON.stringify(this.classes || []) + ', ' + JSON.stringify(this.id || null) + ')+"' + this.selfClose + '>");\n');
954
+ if (this.selfClose == '') {
955
+ out.push('out.push(' + JSON.stringify("</"+(this.nodeType)+">") + ');\n');
956
+ }
957
+ } else {
958
+ this.handleJsExec(out);
959
+ this.handleJsEQ(out);
960
+ this.handleContent(out);
961
+ }
962
+
963
+ return out;
964
+ });
965
+
966
+ OO.addMember("handleJsEQ",function (out) {
967
+ if (this.jsEQ) {
968
+ this.jsEQ = this.jsEQ.replace(/;\s*$/, '');
969
+ out.unshift('out.push(' + this.jsEQ + ');\n');
970
+ }
971
+ });
972
+
973
+ OO.addMember("handleContent",function (out) {
974
+ if (this.content != null && this.content.length > 0) {
975
+ out.unshift('out.push(' + JSON.stringify(this.content) + ');\n');
976
+ }
977
+ });
978
+
979
+
980
+ OO.addMember("handleJsExec",function (out) {
981
+ if (this.jsExec) {
982
+ out.unshift(this.jsExec);
983
+ if (this.jsExec.match(/\{\s*$/)) {
984
+ out.push("}\n");
985
+ }
986
+ }
987
+ });
988
+
989
+ OO.addStaticMember("parseAttributes",function (hash, classes, id) {
990
+ var out = [];
991
+ classes = classes || [];
992
+ if (hash['class']) classes.push(hash['class']);
993
+ if (classes.length) hash['class'] = classes.join(" ");
994
+
995
+ for (var k in hash) {
996
+ if (hash.hasOwnProperty(k)) {
997
+ out.push(k + '=' + JSON.stringify(hash[k]));
998
+ }
999
+ }
1000
+ return (out.length ? ' ' : '') + out.join(' ');
1001
+ });
1002
+ });
1003
+
1004
+
1005
+ JS2.Class.extend('CLI', function(KLASS, OO){
1006
+ // private closure
1007
+
1008
+ var COMMANDS = {
1009
+ help: 'help',
1010
+ render: 'render',
1011
+ compile: 'compile',
1012
+ watch: 'watch'
1013
+ };
1014
+
1015
+
1016
+ OO.addMember("run",function (args) {
1017
+ var opts = this.parseOpts(args);
1018
+ var options = opts[0];
1019
+ var command = opts[1];
1020
+ var files = opts[2];
1021
+ });
1022
+
1023
+ OO.addMember("parseOpts",function (args) {
1024
+ var files = [];
1025
+ var options = {};
1026
+ var command = null;
1027
+
1028
+ var endedArgs = false;
1029
+
1030
+ for(var i=0,_c1=args,_l1=_c1.length,arg;(arg=_c1[i])||(i<_l1);i++){
1031
+ if (endedArgs) {
1032
+ files.push(arg);
1033
+ }
1034
+
1035
+ else if (COMMANDS[arg]) {
1036
+ command = arg;
1037
+ endedArgs = true;
1038
+ }
1039
+
1040
+ else {
1041
+ var setting = arg.match(/^(\w+)(?:=(.*))?$/);
1042
+ if (setting) options[setting[0]] = setting[1] || 'true';
1043
+ }
1044
+ }
1045
+
1046
+ return [ options, command, files ];
1047
+ });
1048
+ });
1049
+
1050
+
701
1051
  })();
702
1052
  FINISH
703
1053
  end
@@ -0,0 +1,5 @@
1
+ require "mochiscript/version"
2
+
3
+ module Mochiscript
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "./lib/mochiscript"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mochiscript"
7
+ s.version = Mochiscript::VERSION
8
+ s.authors = ["Jeff Su"]
9
+ s.email = ["me@jeffsu.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Javascript Dessert}
12
+ s.description = %q{Javascript Dessert}
13
+
14
+ s.rubyforge_project = "mochiscript"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
metadata CHANGED
@@ -1,57 +1,51 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mochiscript
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0.pre10
4
5
  prerelease: 6
5
- version: 0.4.0.pre1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Jeff Su
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-09-25 00:00:00 -07:00
14
- default_executable:
12
+ date: 2011-10-30 00:00:00.000000000Z
15
13
  dependencies: []
16
-
17
14
  description: Javascript Dessert
18
- email:
15
+ email:
19
16
  - me@jeffsu.com
20
17
  executables: []
21
-
22
18
  extensions: []
23
-
24
19
  extra_rdoc_files: []
25
-
26
- files:
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - Rakefile
27
24
  - lib/mochiscript.rb
28
- has_rdoc: true
29
- homepage: ""
25
+ - mochiscript.gemspec
26
+ - mochiscript/lib/mochiscript.rb
27
+ homepage: ''
30
28
  licenses: []
31
-
32
29
  post_install_message:
33
30
  rdoc_options: []
34
-
35
- require_paths:
31
+ require_paths:
36
32
  - lib
37
- required_ruby_version: !ruby/object:Gem::Requirement
33
+ required_ruby_version: !ruby/object:Gem::Requirement
38
34
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: "0"
43
- required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
40
  none: false
45
- requirements:
46
- - - ">"
47
- - !ruby/object:Gem::Version
41
+ requirements:
42
+ - - ! '>'
43
+ - !ruby/object:Gem::Version
48
44
  version: 1.3.1
49
45
  requirements: []
50
-
51
46
  rubyforge_project: mochiscript
52
- rubygems_version: 1.6.2
47
+ rubygems_version: 1.8.10
53
48
  signing_key:
54
49
  specification_version: 3
55
50
  summary: Javascript Dessert
56
51
  test_files: []
57
-