opal-json 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # JSON for Opal
data/lib/opal/json.rb ADDED
@@ -0,0 +1,132 @@
1
+ module JSON
2
+ def self.parse(source)
3
+ %x{
4
+ var json = json_parse(source);
5
+ return to_opal(json);
6
+ }
7
+ end
8
+
9
+ %x{
10
+ var json_parse;
11
+ var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;
12
+
13
+ if (typeof JSON !== 'undefined') {
14
+ json_parse = JSON.parse;
15
+ }
16
+ else {
17
+ json_parse = function(text) {
18
+ console.log("using opal's JSON.parse");
19
+
20
+ text = String(text);
21
+ cx.lastIndex = 0;
22
+
23
+ if (cx.test(text)) {
24
+ text = text.replace(cx, function(a) {
25
+ return '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
26
+ });
27
+ }
28
+
29
+ if (/^[\\],:{}\\s]*$/
30
+ .test(text.replace(/\\\\(?:["\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
31
+ .replace(/"[^"\\\\\\n\\r]*"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')
32
+ .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {
33
+
34
+ return eval('(' + text + ')');
35
+ }
36
+
37
+ throw new SyntaxError('JSON.parse');
38
+ };
39
+ }
40
+
41
+
42
+ function to_opal(value) {
43
+ switch (typeof value) {
44
+ case 'string':
45
+ return value;
46
+
47
+ case 'number':
48
+ return value;
49
+
50
+ case 'boolean':
51
+ return !!value;
52
+
53
+ case 'null':
54
+ return nil;
55
+
56
+ case 'object':
57
+ if (!value) return nil;
58
+
59
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
60
+ var arr = [];
61
+
62
+ for (var i = 0, ii = value.length; i < ii; i++) {
63
+ arr.push(to_opal(value[i]));
64
+ }
65
+
66
+ return arr;
67
+ }
68
+ else {
69
+ var hash = #{ {} }, v, map = hash.map;
70
+
71
+ for (var k in value) {
72
+ if (Object.hasOwnProperty.call(value, k)) {
73
+ v = to_opal(value[k]);
74
+ map[k] = [k, v];
75
+ }
76
+ }
77
+ }
78
+
79
+ return hash;
80
+ }
81
+ };
82
+ }
83
+ end
84
+
85
+ module Kernel
86
+ def to_json; to_s.to_json; end
87
+ end
88
+
89
+ class Numeric
90
+ alias to_json to_s
91
+ end
92
+
93
+ class String
94
+ alias to_json inspect
95
+ end
96
+
97
+ class NilClass
98
+ def to_json; 'null'; end
99
+ end
100
+
101
+ class Boolean
102
+ def to_json; `this.valueOf() ? 'true' : 'false'`; end
103
+ end
104
+
105
+ class Array
106
+ def to_json
107
+ %x{
108
+ var result = [];
109
+
110
+ for (var i = 0, length = this.length; i < length; i++) {
111
+ result.push(#{`this[i]`.to_json});
112
+ }
113
+
114
+ return '[' + result.join(', ') + ']';
115
+ }
116
+ end
117
+ end
118
+
119
+ class Hash
120
+ def to_json
121
+ %x{
122
+ var parts = [], map = this.map, bucket;
123
+
124
+ for (var assoc in map) {
125
+ bucket = map[assoc];
126
+ parts.push(#{`bucket[0]`.to_json} + ': ' + #{`bucket[1]`.to_json});
127
+ }
128
+
129
+ return '{' + parts.join(', ') + '}';
130
+ }
131
+ end
132
+ end
@@ -0,0 +1,31 @@
1
+ describe "JSON.parse" do
2
+ it "parses null into nil" do
3
+ JSON.parse("null").should be_nil
4
+ end
5
+
6
+ it "parses true into true" do
7
+ JSON.parse("true").should be_true
8
+ end
9
+
10
+ it "parses false into false" do
11
+ JSON.parse("false").should be_false
12
+ end
13
+
14
+ it "parses numbers into numbers" do
15
+ JSON.parse("42").should == 42
16
+ JSON.parse("3.142").should == 3.142
17
+ end
18
+
19
+ it "parses arrays into ruby arrays" do
20
+ JSON.parse("[]").should == []
21
+ JSON.parse("[1, 2, 3]").should == [1, 2, 3]
22
+ JSON.parse("[[1, 2, 3], [4, 5]]").should == [[1, 2, 3], [4, 5]]
23
+ JSON.parse("[null, true, false]").should == [nil, true, false]
24
+ end
25
+
26
+ it "parses object literals into ruby hashes" do
27
+ JSON.parse("{}").should == {}
28
+ JSON.parse('{"a": "b"}').should == {"a" => "b"}
29
+ JSON.parse('{"a": null, "b": 10, "c": [true, false]}').should == {"a" => nil, "b" => 10, "c" => [true, false]}
30
+ end
31
+ end
@@ -0,0 +1,53 @@
1
+ describe "Numeric#to_json" do
2
+ it "returns a string representing the number" do
3
+ 42.to_json.should == "42"
4
+ 3.142.to_json.should == "3.142"
5
+ end
6
+ end
7
+
8
+ describe "String#to_json" do
9
+ it "returns an escaped string" do
10
+ "foo".to_json.should == "\"foo\""
11
+ "bar\nbaz".to_json.should == "\"bar\\nbaz\""
12
+ end
13
+ end
14
+
15
+ describe "NilClass#to_json" do
16
+ it "returns 'null'" do
17
+ nil.to_json.should == "null"
18
+ end
19
+ end
20
+
21
+ describe "Boolean#to_s" do
22
+ it "returns 'true' when true" do
23
+ true.to_json.should == "true"
24
+ end
25
+
26
+ it "returns 'false' when false" do
27
+ false.to_json.should == "false"
28
+ end
29
+ end
30
+
31
+ describe "Kernel#to_json" do
32
+ it "returns an escaped #to_s of the receiver" do
33
+ self.to_json.should be_kind_of(String)
34
+ end
35
+ end
36
+
37
+ describe "Array#to_json" do
38
+ it "returns a string of all array elements converted to json" do
39
+ [].to_json.should == "[]"
40
+ [1, 2, 3].to_json.should == "[1, 2, 3]"
41
+ [true, nil, false, "3", 42].to_json.should == '[true, null, false, "3", 42]'
42
+ end
43
+ end
44
+
45
+ describe "Hash#to_json" do
46
+ it "returns a string of all key and value pairs" do
47
+ {}.to_json.should == "{}"
48
+ {"a" => 1, "b" => 2}.to_json.should == '{"a": 1, "b": 2}'
49
+
50
+ hash = {"a" => 1, "b" => false, "c" => nil, "d" => true}
51
+ JSON.parse(hash.to_json).should == hash
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opal-json
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Adam Beynon
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-20 00:00:00.000000000Z
13
+ dependencies: []
14
+ description:
15
+ email:
16
+ - adam@adambeynon.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/opal/json.rb
22
+ - README.md
23
+ - spec/parse_spec.rb
24
+ - spec/to_json_spec.rb
25
+ homepage: http://github.com/opal/opal_json
26
+ licenses: []
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ! '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 1.8.11
46
+ signing_key:
47
+ specification_version: 3
48
+ summary: JSON implementation for opal
49
+ test_files:
50
+ - spec/parse_spec.rb
51
+ - spec/to_json_spec.rb