myson 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +34 -0
- data/Rakefile +14 -0
- data/TODO.md +5 -0
- data/lib/myson.rb +9 -0
- data/lib/myson.y +106 -0
- data/lib/myson/generated_parser.rb +1149 -0
- data/lib/myson/parser.rb +31 -0
- data/lib/myson/version.rb +3 -0
- data/myson.gemspec +22 -0
- data/spec/array_spec.txt +24 -0
- data/spec/constant_spec.txt +5 -0
- data/spec/myson_spec.rb +81 -0
- data/spec/number_spec.txt +25 -0
- data/spec/object_spec.txt +10 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/string_spec.txt +26 -0
- metadata +134 -0
data/lib/myson/parser.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'myson/generated_parser'
|
4
|
+
|
5
|
+
module Myson
|
6
|
+
class Parser < GeneratedParser
|
7
|
+
KNOWN_TOKENS = Myson::GeneratedParser::Racc_arg[10].keys.select{|k| k.is_a?(String) }
|
8
|
+
|
9
|
+
def initialize(json)
|
10
|
+
@input = StringIO.new(json)
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
do_parse
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
def next_token
|
19
|
+
c = @input.read(1)
|
20
|
+
return nil if c == nil
|
21
|
+
|
22
|
+
c_type = KNOWN_TOKENS.include?(c) ? c : :OTHER
|
23
|
+
|
24
|
+
[c_type, c]
|
25
|
+
end
|
26
|
+
|
27
|
+
def make_unicode_char(code)
|
28
|
+
'' << code
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/myson.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/myson/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Jacob Dam"]
|
6
|
+
gem.email = ["jdam@digication.com"]
|
7
|
+
gem.description = %q{JSON parser}
|
8
|
+
gem.summary = %q{JSON parser using racc}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "myson"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Myson::VERSION
|
17
|
+
|
18
|
+
gem.add_runtime_dependency('racc')
|
19
|
+
|
20
|
+
gem.add_development_dependency('rspec', '~> 2.10')
|
21
|
+
gem.add_development_dependency('rake')
|
22
|
+
end
|
data/spec/array_spec.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
@linepair
|
2
|
+
[]
|
3
|
+
=> []
|
4
|
+
|
5
|
+
[1]
|
6
|
+
=> [1]
|
7
|
+
|
8
|
+
[null, 123, 45.6e+7, true, false, []]
|
9
|
+
=> [nil, 123, 45.6e+7, true, false, []]
|
10
|
+
|
11
|
+
[,]
|
12
|
+
=> error
|
13
|
+
|
14
|
+
[, 123, 456]
|
15
|
+
=> error
|
16
|
+
|
17
|
+
[123, 456, ]
|
18
|
+
=> error
|
19
|
+
|
20
|
+
[123,, 456]
|
21
|
+
=> error
|
22
|
+
|
23
|
+
123, 456
|
24
|
+
=> error
|
data/spec/myson_spec.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Myson do
|
4
|
+
def self.parse_and_generate_spec(file)
|
5
|
+
lines = File.readlines(file)
|
6
|
+
|
7
|
+
directives = []
|
8
|
+
directives = lines.shift.split(' ').map{ |d| d.gsub('@', '') } if lines.first[0...1] == '@'
|
9
|
+
|
10
|
+
if directives.include?('singleline')
|
11
|
+
lines = lines.map{ |line| line.strip }
|
12
|
+
lines = lines.select{ |line| line != '' && line[0...1] != '#' }
|
13
|
+
specs = lines.map{ |line|
|
14
|
+
json, ruby = line.split(/\s+/)
|
15
|
+
|
16
|
+
[json.strip, ruby.strip]
|
17
|
+
}
|
18
|
+
elsif directives.include?('linepair')
|
19
|
+
specs = []
|
20
|
+
json = nil
|
21
|
+
ruby = nil
|
22
|
+
lines.each do |line|
|
23
|
+
if line.match(/^=>/)
|
24
|
+
ruby = line.gsub(/^=>/, '').strip
|
25
|
+
else
|
26
|
+
json = line.strip
|
27
|
+
end
|
28
|
+
|
29
|
+
if ruby
|
30
|
+
raise "Invalid specs file: `#{file}'" if json == nil
|
31
|
+
specs << [json, ruby]
|
32
|
+
json = nil
|
33
|
+
ruby = nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
else
|
37
|
+
raise "Invalid specs file: `#{file}'"
|
38
|
+
end
|
39
|
+
|
40
|
+
specs.each do |json, ruby|
|
41
|
+
j, r = json, ruby
|
42
|
+
if ruby == 'error'
|
43
|
+
it "should parse `#{json}' and raise error" do
|
44
|
+
expect{ Myson.parse(example.metadata['json']) }.to raise_error
|
45
|
+
end
|
46
|
+
else
|
47
|
+
it "should parse `#{json}' to #{ruby}" do
|
48
|
+
Myson.parse(j).should == eval(r)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.parse' do
|
55
|
+
context 'constant' do
|
56
|
+
parse_and_generate_spec(File.dirname(__FILE__) + '/constant_spec.txt')
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'number' do
|
60
|
+
parse_and_generate_spec(File.dirname(__FILE__) + '/number_spec.txt')
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'array' do
|
64
|
+
parse_and_generate_spec(File.dirname(__FILE__) + '/array_spec.txt')
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'string' do
|
68
|
+
parse_and_generate_spec(File.dirname(__FILE__) + '/string_spec.txt')
|
69
|
+
|
70
|
+
if RUBY_VERSION >= '1.9'
|
71
|
+
it %Q{should parse `"unicode \u1234" to "unicode \u1234"'} do
|
72
|
+
Myson.parse('"unicode \u1234"').should == "unicode \u1234"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'object' do
|
78
|
+
parse_and_generate_spec(File.dirname(__FILE__) + '/object_spec.txt')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
@singleline
|
2
|
+
|
3
|
+
0 0
|
4
|
+
1 1
|
5
|
+
1234567890 1234567890
|
6
|
+
0123 error
|
7
|
+
|
8
|
+
-123 -123
|
9
|
+
-0 0
|
10
|
+
+123 error
|
11
|
+
|
12
|
+
123.456 123.456
|
13
|
+
.456 error
|
14
|
+
123. error
|
15
|
+
-123.456 -123.456
|
16
|
+
|
17
|
+
0e123 0
|
18
|
+
123e1 1230.0
|
19
|
+
123e+1 1230.0
|
20
|
+
123e-1 12.3
|
21
|
+
123e error
|
22
|
+
123e12.3 error
|
23
|
+
123e12 123e12
|
24
|
+
12.3e+2 1230.0
|
25
|
+
-12.3e+2 -1230.0
|
@@ -0,0 +1,10 @@
|
|
1
|
+
@linepair
|
2
|
+
|
3
|
+
{}
|
4
|
+
=> {}
|
5
|
+
|
6
|
+
{ "foo" : "bar" }
|
7
|
+
=> {"foo" => "bar"}
|
8
|
+
|
9
|
+
{"s":"a", "n": 123.4, "t": true, "f": false, "nu": null, "":"", "ar": [123, {}], "ob": {"foo":"bar"}}
|
10
|
+
=> {"s"=>"a", "n"=>123.4, "t"=>true, "f"=>false, "nu"=>nil, ""=>"", "ar"=>[123, {}], "ob"=>{"foo"=>"bar"}}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
@linepair
|
2
|
+
|
3
|
+
""
|
4
|
+
=> ""
|
5
|
+
|
6
|
+
"abcdefghijklmnopqrstuvxyz0123456789"
|
7
|
+
=> "abcdefghijklmnopqrstuvxyz0123456789"
|
8
|
+
|
9
|
+
"escaped chars \n \r \t \b \f."
|
10
|
+
=> "escaped chars \n \r \t \b \f."
|
11
|
+
|
12
|
+
"unicode \u0000 \u005a \u005A"
|
13
|
+
=> "unicode \x00 \x5A \x5A"
|
14
|
+
|
15
|
+
|
16
|
+
"slash and char \\ \' \" \a \1"
|
17
|
+
=> "slash and char \\ ' \" a 1"
|
18
|
+
|
19
|
+
"""
|
20
|
+
=> error
|
21
|
+
|
22
|
+
""""
|
23
|
+
=> error
|
24
|
+
|
25
|
+
"\"
|
26
|
+
=> error
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: myson
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jacob Dam
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-07-01 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
|
+
none: false
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
hash: 3
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
prerelease: false
|
31
|
+
type: :runtime
|
32
|
+
name: racc
|
33
|
+
requirement: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
hash: 23
|
41
|
+
segments:
|
42
|
+
- 2
|
43
|
+
- 10
|
44
|
+
version: "2.10"
|
45
|
+
prerelease: false
|
46
|
+
type: :development
|
47
|
+
name: rspec
|
48
|
+
requirement: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
hash: 3
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
prerelease: false
|
60
|
+
type: :development
|
61
|
+
name: rake
|
62
|
+
requirement: *id003
|
63
|
+
description: JSON parser
|
64
|
+
email:
|
65
|
+
- jdam@digication.com
|
66
|
+
executables: []
|
67
|
+
|
68
|
+
extensions: []
|
69
|
+
|
70
|
+
extra_rdoc_files: []
|
71
|
+
|
72
|
+
files:
|
73
|
+
- .gitignore
|
74
|
+
- .rspec
|
75
|
+
- .travis.yml
|
76
|
+
- Gemfile
|
77
|
+
- LICENSE
|
78
|
+
- README.md
|
79
|
+
- Rakefile
|
80
|
+
- TODO.md
|
81
|
+
- lib/myson.rb
|
82
|
+
- lib/myson.y
|
83
|
+
- lib/myson/generated_parser.rb
|
84
|
+
- lib/myson/parser.rb
|
85
|
+
- lib/myson/version.rb
|
86
|
+
- myson.gemspec
|
87
|
+
- spec/array_spec.txt
|
88
|
+
- spec/constant_spec.txt
|
89
|
+
- spec/myson_spec.rb
|
90
|
+
- spec/number_spec.txt
|
91
|
+
- spec/object_spec.txt
|
92
|
+
- spec/spec_helper.rb
|
93
|
+
- spec/string_spec.txt
|
94
|
+
homepage: ""
|
95
|
+
licenses: []
|
96
|
+
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
hash: 3
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
version: "0"
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
hash: 3
|
117
|
+
segments:
|
118
|
+
- 0
|
119
|
+
version: "0"
|
120
|
+
requirements: []
|
121
|
+
|
122
|
+
rubyforge_project:
|
123
|
+
rubygems_version: 1.8.24
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: JSON parser using racc
|
127
|
+
test_files:
|
128
|
+
- spec/array_spec.txt
|
129
|
+
- spec/constant_spec.txt
|
130
|
+
- spec/myson_spec.rb
|
131
|
+
- spec/number_spec.txt
|
132
|
+
- spec/object_spec.txt
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
- spec/string_spec.txt
|