mochiscript 0.4.0.pre1 → 0.4.0.pre10

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.
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
-