jsony 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ GemSpec = Gem::Specification.new do |gem|
4
+ gem.name = 'jsony'
5
+ gem.version = '0.0.1'
6
+ gem.license = 'MIT'
7
+ gem.required_ruby_version = '>= 1.9.1'
8
+
9
+ gem.authors << 'Ingy döt Net'
10
+ gem.email = 'ingy@ingy.net'
11
+ gem.summary = 'Relaxed JSON with a little bit of YAML'
12
+ gem.description = <<-'.'
13
+ JSONY is a data language that is simlar to JSON, just more chill. All valid
14
+ JSON is also valid JSONY (and represents the same thing when decoded), but
15
+ JSONY lets you omit a lot of the syntax that makes JSON a pain to write.
16
+ .
17
+ gem.homepage = 'http://jsony.org'
18
+
19
+ gem.files = `git ls-files`.lines.map{|l|l.chomp}
20
+
21
+ gem.add_dependency 'pegex', '>= 0.0.2'
22
+ gem.add_development_dependency 'testml-lite', '>= 0.0.1'
23
+ end
@@ -0,0 +1,3 @@
1
+ - version: 0.0.1
2
+ date: Wed Dec 19 22:35:56 PST 2012
3
+ changes: First release
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -0,0 +1,18 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ jsony (0.0.1)
5
+ pegex (>= 0.0.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ pegex (0.0.2)
11
+ testml-lite (0.0.1)
12
+
13
+ PLATFORMS
14
+ ruby
15
+
16
+ DEPENDENCIES
17
+ jsony!
18
+ testml-lite (>= 0.0.1)
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ (The MIT License)
2
+
3
+ Copyright © 2012 Ingy döt Net
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the ‘Software’), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9
+ of the Software, and to permit persons to whom the Software is furnished to do
10
+ so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,86 @@
1
+ = JSONY - Relaxed JSON with a little bit of YAML
2
+
3
+ = Synopsis
4
+
5
+ require 'jsony'
6
+
7
+ data = JSONY.load jsony_string
8
+
9
+ = Description
10
+
11
+ JSONY is a data language that is simlar to JSON, just more chill. All valid
12
+ JSON is also valid JSONY (and represents the same thing when loaded), but
13
+ JSONY lets you omit a lot of the syntax that makes JSON a pain to write.
14
+
15
+ = API
16
+
17
+ JSONY has one method +JSON.load+. You pass it a JSONY string and it returns the
18
+ decoded Ruby data object.
19
+
20
+ Note: JSONY is basically hand-written format, so to serialize it back to disk
21
+ you can just use the JSON dump serialization (for now), and it will round-trip
22
+ safely.
23
+
24
+ = JSONY Syntax
25
+
26
+ Here is some examples of JSONY followed by equivalent JSON:
27
+
28
+ Words don't need quotes. A list of things is an array:
29
+
30
+ foo bar baz
31
+
32
+ [ "foo", "bar", "baz" ]
33
+
34
+ Strings with spaces can use single or double quotes:
35
+
36
+ 'foo bar' # <= This is (a comment indicating) a string
37
+ # More commenting
38
+ "baz boom "
39
+
40
+ [ "foo bar ", "baz boom " ]
41
+
42
+ Top level hashes can either use ':' separated pairs or use curlies. Sub-hashes
43
+ require curlies.
44
+
45
+ foo: { bar baz }
46
+ num: -1.2e3
47
+
48
+ { "foo": { "bar": "baz" }, "num": -1.2e3 }
49
+
50
+ Top level arrays can use +'- '+ at the start of lines. Those arrays go the
51
+ end of line. Lines can be continued using a trailing comma. Sub arrays require
52
+ square brackets.
53
+
54
+ - array of 4 scalars
55
+ - array with [ sub
56
+ array { of
57
+ things }]
58
+ - array of 7 things on,
59
+ two lines
60
+
61
+ [
62
+ [ "array", "of", 4, "scalars" ],
63
+ [ "array", "with", [ "sub", "array" { "of", "things" } ] ],
64
+ [ "array", "of", 7, "things", on, "two", "lines" ]
65
+ ]
66
+
67
+ More soon...
68
+
69
+ NOTE: You may want to look at the tests (especially +test/decode.rb+) to see
70
+ the full abilities of JSONY.
71
+
72
+ = Status
73
+
74
+ *BEWARE!!!*
75
+
76
+ JSONY is mst's idea, and ingy's Pegex-based implementation. The language is
77
+ just a baby, and will change a lot, or may go away entirely.
78
+
79
+ Development people are currently working on this in +#jsony+ in
80
+ irc.freenode.net. Please drop by.
81
+
82
+ http://jsony.org/ coming soon.
83
+
84
+ = Copyright
85
+
86
+ Copyright (c) 2012 Ingy döt Net. See LICENSE for further details.
@@ -0,0 +1,64 @@
1
+ # Load Gem constants from the gemspec
2
+ GemSpecFile = '.gemspec'
3
+ load GemSpecFile
4
+ GemName = GemSpec.name
5
+ GemVersion = GemSpec.version
6
+ GemDir = "#{GemName}-#{GemVersion}"
7
+ GemFile = "#{GemDir}.gem"
8
+ DevNull = '2>/dev/null'
9
+
10
+ # Require the Rake libraries
11
+ require 'rake'
12
+ require 'rake/testtask'
13
+ require 'rake/clean'
14
+
15
+ task :default => 'help'
16
+
17
+ CLEAN.include GemDir, GemFile, 'data.tar.gz', 'metadata.gz'
18
+
19
+ desc 'Run the tests'
20
+ task :test do
21
+ Rake::TestTask.new do |t|
22
+ t.verbose = true
23
+ t.test_files = FileList['test/*.rb']
24
+ end
25
+ end
26
+
27
+ desc 'Build the gem'
28
+ task :build => [:clean, :test] do
29
+ sh "gem build #{GemSpecFile}"
30
+ end
31
+
32
+ desc 'Install the gem'
33
+ task :install => [:build] do
34
+ sh "gem install #{GemFile}"
35
+ end
36
+
37
+ desc 'Build, unpack and inspect the gem'
38
+ task :distdir => [:build] do
39
+ sh "tar xf #{GemFile} #{DevNull}"
40
+ Dir.mkdir GemDir
41
+ Dir.chdir GemDir
42
+ sh "tar xzf ../data.tar.gz #{DevNull}"
43
+ puts "\n>>> Entering sub-shell for #{GemDir}..."
44
+ system ENV['SHELL']
45
+ end
46
+
47
+ desc 'Build and push the gem'
48
+ task :release => [:build] do
49
+ sh "gem push #{GemFile}"
50
+ end
51
+
52
+ desc 'Print a description of the gem'
53
+ task :desc do
54
+ puts "Gem: '#{GemName}' (version #{GemVersion})"
55
+ puts
56
+ puts GemSpec.description.gsub /^/, ' '
57
+ end
58
+
59
+ desc 'List the Rakefile tasks'
60
+ task :help do
61
+ puts 'The following rake tasks are available:'
62
+ puts
63
+ puts `rake -T`.gsub /^/, ' '
64
+ end
data/ToDo ADDED
@@ -0,0 +1,9 @@
1
+ - Port remainder of tests
2
+ - Support null
3
+ - Need to suupport return value of nil in pegex-rb
4
+ - Use jsony-tml repo
5
+ - Submodule?
6
+ - Use jsony-pgx repo
7
+ - Submodule?
8
+ - Add submodule init to Rakefile
9
+ - Add git-pull task to Rakefile
@@ -0,0 +1,14 @@
1
+ require 'jsony/grammar'
2
+ require 'jsony/receiver'
3
+ require 'pegex/parser'
4
+
5
+ module JSONY
6
+ def self.load jsony_str
7
+ parser = Pegex::Parser.new do |p|
8
+ p.grammar = JSONY::Grammar.new
9
+ p.receiver = JSONY::Receiver.new
10
+ end
11
+ # parser.debug = true
12
+ parser.parse jsony_str
13
+ end
14
+ end
@@ -0,0 +1,89 @@
1
+ module JSONY;end
2
+ require 'pegex/grammar'
3
+ class JSONY::Grammar < Pegex::Grammar
4
+ def make_tree
5
+ {"+toprule"=>"jsony",
6
+ "+grammar"=>"jsony",
7
+ "+version"=>"0.0.1",
8
+ "jsony"=>
9
+ {".any"=>
10
+ [{".ref"=>"seq"},
11
+ {".ref"=>"map"},
12
+ {".ref"=>"top_seq"},
13
+ {".ref"=>"top_map"},
14
+ {".ref"=>"list"}]},
15
+ "seq"=>
16
+ {".all"=>
17
+ [{".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
18
+ {".ref"=>"LSQUARE"},
19
+ {".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
20
+ {".ref"=>"node",
21
+ "+min"=>0,
22
+ ".sep"=>
23
+ {".rgx"=>
24
+ "(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*,?(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*",
25
+ "+eok"=>true}},
26
+ {".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
27
+ {".ref"=>"RSQUARE"},
28
+ {".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"}]},
29
+ "LSQUARE"=>{".rgx"=>"\\["},
30
+ "node"=>{".any"=>[{".ref"=>"map"}, {".ref"=>"seq"}, {".ref"=>"scalar"}]},
31
+ "map"=>
32
+ {".all"=>
33
+ [{".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
34
+ {".ref"=>"LCURLY"},
35
+ {".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
36
+ {".ref"=>"pair", "+min"=>0},
37
+ {".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
38
+ {".ref"=>"RCURLY"},
39
+ {".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"}]},
40
+ "LCURLY"=>{".rgx"=>"\\{"},
41
+ "pair"=>
42
+ {".all"=>
43
+ [{".ref"=>"string"},
44
+ {".rgx"=>
45
+ "(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*:?(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
46
+ {".ref"=>"node"},
47
+ {".rgx"=>
48
+ "(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*,?(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"}]},
49
+ "string"=>{".ref"=>"scalar"},
50
+ "scalar"=>
51
+ {".any"=>[{".ref"=>"double"}, {".ref"=>"single"}, {".ref"=>"bare"}]},
52
+ "double"=>
53
+ {".rgx"=>
54
+ "\"((?:\\\\(?:[\"\\\\/bfnrt]|u[0-9a-fA-F]{4})|[^\"\\x00-\\x1f])*)\""},
55
+ "single"=>{".rgx"=>"'([^']*)'"},
56
+ "bare"=>{".rgx"=>"([^\\s\\{\\}\\[\\]'\",]*[^\\s\\{\\}\\[\\]'\",:])"},
57
+ "RCURLY"=>{".rgx"=>"\\}"},
58
+ "RSQUARE"=>{".rgx"=>"\\]"},
59
+ "top_seq"=>{".ref"=>"top_seq_entry", "+min"=>1},
60
+ "top_seq_entry"=>
61
+ {".all"=>
62
+ [{".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*\\-\\ +"},
63
+ {".all"=>
64
+ [{".ref"=>"node",
65
+ "+min"=>0,
66
+ ".sep"=>
67
+ {".rgx"=>
68
+ "(?:\\ *,\\ *\\r?\\n(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*|\\ +)",
69
+ "+eok"=>true}},
70
+ {".any"=>[{".ref"=>"comment"}, {".ref"=>"EOL"}]}]}]},
71
+ "comment"=>{".rgx"=>"(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n)"},
72
+ "EOL"=>{".rgx"=>"\\r?\\n"},
73
+ "top_map"=>
74
+ {".all"=>
75
+ [{".ref"=>"string"},
76
+ {".rgx"=>
77
+ "(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*:(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"},
78
+ {".ref"=>"node"},
79
+ {".rgx"=>"(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*"}],
80
+ "+min"=>1},
81
+ "list"=>
82
+ {".ref"=>"node",
83
+ "+min"=>0,
84
+ ".sep"=>
85
+ {".rgx"=>
86
+ "(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*,?(?:\\s|(?:\\#\\ .*\\r?\\n|\\#\\r?\\n|\\ *\\r?\\n))*",
87
+ "+eok"=>true}}}
88
+ end
89
+ end
@@ -0,0 +1,45 @@
1
+ require 'pegex/tree'
2
+
3
+ class JSONY::Receiver < Pegex::Tree
4
+ def got_top_seq_entry got
5
+ got[0][0]
6
+ end
7
+
8
+ def got_top_map got
9
+ got_map [got]
10
+ end
11
+
12
+ def got_seq got
13
+ got[0]
14
+ end
15
+
16
+ def got_map got
17
+ Hash[got[0]]
18
+ end
19
+
20
+ def got_string got
21
+ got.to_s
22
+ end
23
+
24
+ def got_bare got
25
+ case got
26
+ when 'true' # XXX is it a bug in jsony-pm that it's unanchored
27
+ true
28
+ when 'false'
29
+ false
30
+ when 'null'
31
+ 'fake-nil'
32
+ # TODO golf this \ if possible
33
+ when \
34
+ /^(
35
+ -?
36
+ (?: 0 | [1-9] [0-9]* )
37
+ (?: \. [0-9]* )?
38
+ (?: [eE] [\-\+]? [0-9]+ )?
39
+ )$/x
40
+ got.to_i
41
+ else
42
+ got.to_s
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,88 @@
1
+ %grammar jsony
2
+ %version 0.0.1
3
+
4
+ jsony:
5
+ seq | map | top_seq | top_map | list
6
+
7
+ node: map | seq | scalar
8
+
9
+ map:
10
+ ~LCURLY~
11
+ pair*
12
+ ~RCURLY~
13
+
14
+ pair: string /~<COLON>?~/ node /~<COMMA>?~/
15
+
16
+ seq:
17
+ ~LSQUARE~
18
+ node* %% /~<COMMA>?~/
19
+ ~RSQUARE~
20
+
21
+ top_seq: top_seq_entry+
22
+
23
+ top_seq_entry:
24
+ /~ <DASH> <SPACE>+ /
25
+ (
26
+ node* %% / (: <SPACE>* <COMMA> <SPACE>* <EOL> ~ | <SPACE>+ ) /
27
+ ( <comment> | <EOL> )
28
+ )
29
+
30
+ top_map:
31
+ (string /~<COLON>~/ node ~)+
32
+
33
+ list: node* %% /~<COMMA>?~/
34
+
35
+ scalar: double | single | bare
36
+
37
+ string: scalar
38
+
39
+ # Interpretation of http://www.json.org/
40
+ double: /
41
+ <DOUBLE>
42
+ (
43
+ (:
44
+ <BACK> (: # Backslash escapes
45
+ [
46
+ <DOUBLE> # Double Quote
47
+ <BACK> # Back Slash
48
+ <SLASH> # Foreward Slash
49
+ b # Back Space
50
+ f # Form Feed
51
+ n # New Line
52
+ r # Carriage Return
53
+ t # Horizontal Tab
54
+ ]
55
+ |
56
+ u <HEX>{4} # Unicode octet pair
57
+ )
58
+ |
59
+ [^ <DOUBLE> <CONTROLS> ] # Anything else
60
+ )*
61
+ )
62
+ <DOUBLE>
63
+ /
64
+
65
+ # TODO: Support '' as escape for single quote
66
+ single: /
67
+ <SINGLE>
68
+ ([^ <SINGLE> ]*)
69
+ <SINGLE>
70
+ /
71
+
72
+ bare: /( [^ <excludes> ]* [^ <excludes> <COLON> ] )/
73
+
74
+ excludes: /
75
+ <WS>
76
+ <LCURLY><RCURLY>
77
+ <LSQUARE><RSQUARE>
78
+ <SINGLE><DOUBLE>
79
+ <COMMA>
80
+ /
81
+
82
+ ws: /(: <WS> | <comment> )/
83
+
84
+ comment: /(:
85
+ <HASH> <SPACE> <ANY>* <EOL> |
86
+ <HASH> <EOL> |
87
+ <SPACE>* <EOL>
88
+ )/
@@ -0,0 +1,176 @@
1
+ require './test/lib/test_helper'
2
+
3
+ TestML.run do |t|
4
+ # Make sure the JSONY parses to what we expect:
5
+ t.eval '*jsony.jsony_load.String == *json.json_load.String'
6
+
7
+ # Make sure JSONY parses the JSON form the same as a JSON parser:
8
+ t.eval '*json.jsony_load.String == *json.json_load.String'
9
+ end
10
+
11
+ TestML.data <<'.'
12
+ #%TestML 1.0
13
+ #
14
+ ## Make sure the JSONY parses to what we expect:
15
+ #*jsony.jsony_load.String == *json.json_load.String;
16
+ #
17
+ ## Make sure JSONY parses the JSON form the same as a JSON parser:
18
+ #*json.jsony_load.String == *json.json_load.String;
19
+
20
+ === String splitting 1
21
+ --- jsony: foo bar baz
22
+ --- json: [ "foo", "bar", "baz" ]
23
+
24
+ === String splitting 2
25
+ --- jsony
26
+ foo bar
27
+ baz
28
+ --- json: [ "foo", "bar", "baz" ]
29
+
30
+ === String splitting 3
31
+ --- jsony: foo "bar baz"
32
+ --- json: [ "foo", "bar baz" ]
33
+
34
+ === Number conversion
35
+ --- jsony: foo 3 bar
36
+ --- json: [ "foo", 3, "bar" ]
37
+
38
+ === Specials
39
+ --- SKIP
40
+ --- jsony: one true two false three null
41
+ --- json: [ "one", true, "two", false, "three", null ]
42
+
43
+ === Object 1
44
+ --- jsony
45
+ { foo bar baz 1 }
46
+ --- json
47
+ {
48
+ "foo": "bar",
49
+ "baz": 1
50
+ }
51
+
52
+ === Object 2
53
+ --- jsony
54
+ plugin Server {
55
+ host example.com
56
+ port 8080
57
+ }
58
+ plugin Frobnicator {
59
+ harder true
60
+ }
61
+ --- json
62
+ [
63
+ "plugin", "Server", {
64
+ "host": "example.com",
65
+ "port": 8080
66
+ },
67
+ "plugin", "Frobnicator", {
68
+ "harder": true
69
+ }
70
+ ]
71
+
72
+ === Log line example
73
+ --- jsony
74
+ 2012-09-10T17:00:34 /users/bob/edit { user admin }
75
+ --- json
76
+ [ "2012-09-10T17:00:34", "/users/bob/edit", { "user": "admin" } ]
77
+
78
+ === Config file example
79
+ --- jsony
80
+ plugin Server {
81
+ host example.com
82
+ port 8080
83
+ }
84
+ dsn "dbi:SQLite:filename=my.db"
85
+ allow hosts [ jules sherlock kitty ]
86
+
87
+ --- json
88
+ [
89
+ "plugin", "Server", {
90
+ "host": "example.com",
91
+ "port": 8080
92
+ },
93
+ "dsn", "dbi:SQLite:filename=my.db",
94
+ "allow", "hosts", [ "jules", "sherlock", "kitty" ]
95
+ ]
96
+
97
+ === activitystrea.ms example
98
+ --- jsony
99
+ {
100
+ published 2011-02-10T15:04:55Z
101
+ actor {
102
+ url http://example.org/martin
103
+ objectType person
104
+ id 'tag:example.org,2011:martin'
105
+ image {
106
+ url http://example.org/martin/image
107
+ width 250
108
+ height 250
109
+ }
110
+ displayName "Martin Smith"
111
+ }
112
+ verb post
113
+ object {
114
+ url http://example.org/blog/2011/02/entry
115
+ id 'tag:example.org,2011:abc123/xyz'
116
+ }
117
+ target {
118
+ url http://example.org/blog/
119
+ objectType blog
120
+ id 'tag:example.org,2011:abc123'
121
+ displayName "Martin's Blog"
122
+ }
123
+ }
124
+
125
+ --- json
126
+ {
127
+ "published": "2011-02-10T15:04:55Z",
128
+ "actor": {
129
+ "url": "http://example.org/martin",
130
+ "objectType" : "person",
131
+ "id": "tag:example.org,2011:martin",
132
+ "image": {
133
+ "url": "http://example.org/martin/image",
134
+ "width": 250,
135
+ "height": 250
136
+ },
137
+ "displayName": "Martin Smith"
138
+ },
139
+ "verb": "post",
140
+ "object" : {
141
+ "url": "http://example.org/blog/2011/02/entry",
142
+ "id": "tag:example.org,2011:abc123/xyz"
143
+ },
144
+ "target" : {
145
+ "url": "http://example.org/blog/",
146
+ "objectType": "blog",
147
+ "id": "tag:example.org,2011:abc123",
148
+ "displayName": "Martin's Blog"
149
+ }
150
+ }
151
+
152
+ === Comments
153
+ --- jsony
154
+ foo bar # comment
155
+ \# Comment
156
+ url http://xyz.com#not_comment
157
+ --- json
158
+ [
159
+ "foo",
160
+ "bar",
161
+ "url",
162
+ "http://xyz.com#not_comment"
163
+ ]
164
+
165
+ === Top Level Mapping
166
+ --- jsony
167
+ foo: bar
168
+ baz: 42
169
+ --- json: {"foo": "bar", "baz": 42}
170
+
171
+ === Top Level Sequence
172
+ --- jsony
173
+ - foo bar
174
+ - foo bar
175
+ --- json: [["foo", "bar"],["foo", "bar"]]
176
+ .
@@ -0,0 +1,10 @@
1
+ require 'testml/lite'
2
+ require 'jsony'
3
+ require 'json'
4
+
5
+ class TestPegex < TestML::Lite
6
+ include TestML::Lite::TestCases
7
+ def jsony_load str; JSONY.load str end
8
+ def json_load str; JSON.load str end
9
+ def String obj; obj.inspect end
10
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jsony
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ingy döt Net
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: pegex
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: testml-lite
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.0.1
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.0.1
46
+ description: ! 'JSONY is a data language that is simlar to JSON, just more chill.
47
+ All valid
48
+
49
+ JSON is also valid JSONY (and represents the same thing when decoded), but
50
+
51
+ JSONY lets you omit a lot of the syntax that makes JSON a pain to write.
52
+
53
+ '
54
+ email: ingy@ingy.net
55
+ executables: []
56
+ extensions: []
57
+ extra_rdoc_files: []
58
+ files:
59
+ - .gemspec
60
+ - CHANGELOG.yaml
61
+ - Gemfile
62
+ - Gemfile.lock
63
+ - LICENSE
64
+ - README.rdoc
65
+ - Rakefile
66
+ - ToDo
67
+ - lib/jsony.rb
68
+ - lib/jsony/grammar.rb
69
+ - lib/jsony/receiver.rb
70
+ - share/jsony.pgx
71
+ - test/decode.rb
72
+ - test/lib/test_helper.rb
73
+ homepage: http://jsony.org
74
+ licenses:
75
+ - MIT
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 1.9.1
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 1.8.23
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: Relaxed JSON with a little bit of YAML
98
+ test_files: []