myson 0.0.1

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.
@@ -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
@@ -0,0 +1,3 @@
1
+ module Myson
2
+ VERSION = "0.0.1"
3
+ 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
@@ -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
@@ -0,0 +1,5 @@
1
+ @singleline
2
+
3
+ null nil
4
+ true true
5
+ false false
@@ -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"}}
@@ -0,0 +1,8 @@
1
+ $:.unshift File.dirname(__FILE__) + '/../lib'
2
+ require 'myson'
3
+
4
+ RSpec.configure do |config|
5
+ config.treat_symbols_as_metadata_keys_with_true_values = true
6
+ config.run_all_when_everything_filtered = true
7
+ config.filter_run :focus
8
+ end
@@ -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