json-next 1.1.0 → 1.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4bc912a3a1cfbfee8f003ec071192735ec5f638
4
- data.tar.gz: 493c00f3d34dc0c3f868f28d52e254b07686b4c5
3
+ metadata.gz: 8be12b2735cd395e2b7df815212ae0883813ebd5
4
+ data.tar.gz: c2825771ae3b950e828fdc3de35261b039bec33c
5
5
  SHA512:
6
- metadata.gz: 717d9c8b9bdc8f63fb8abbc2de0e76b6d1355bb17edf30702c61449ff5ce9f739d1f9f3bac5c11eeb169d2488a04ef17f9624c63fdb1e614d713ab7bbdb19b1a
7
- data.tar.gz: a57f3d1a612907827b3ae7decbff6bd55d963f214499a551fe166d6a427029d02f5a0ceee7b28ded0ee269a31282b14ca731beae9f007174ae6f7197626f1cb2
6
+ metadata.gz: 9e70939b56c4c28d44ac85ee00e3b8c03d0e835ed408f47aef1a5e521a6eb92f76f7ad35bbad3b1e3a8873da903a04f38b095822ea25f7a5896d2899f4ba767f
7
+ data.tar.gz: 3c45fdada52846cc88eccad43f6bab60ed63e7ef59a6f9ec352fa61995c914d05405174ccc357d4af4c90e80d11ed74b3d2c77c5179ccd5bfc51407b05420145
@@ -5,11 +5,20 @@ Rakefile
5
5
  lib/json/next.rb
6
6
  lib/json/next/commata.rb
7
7
  lib/json/next/parser/hanson.rb
8
+ lib/json/next/parser/jsonx.rb
8
9
  lib/json/next/parser/son.rb
9
10
  lib/json/next/pattern.rb
10
11
  lib/json/next/version.rb
12
+ test/data/commata1.txt
13
+ test/data/commata2a.txt
14
+ test/data/commata2b.txt
15
+ test/data/hanson1.txt
16
+ test/data/jsonx1.txt
17
+ test/data/jsonx2.txt
18
+ test/data/son1.txt
11
19
  test/helper.rb
12
20
  test/test_commata.rb
13
21
  test/test_parser_hanson.rb
22
+ test/test_parser_jsonx.rb
14
23
  test/test_parser_son.rb
15
24
  test/test_version.rb
data/README.md CHANGED
@@ -1,20 +1,21 @@
1
- # jasony
1
+ # json-next
2
2
 
3
- jasony gem - read generation y / next generation json versions (HanSON, SON, etc.) with comments, unquoted keys, multi-line strings, trailing commas, optional commas, and more
3
+ json-next gem - read generation y / next generation json versions (HanSON, SON, JSONX/JSON11, etc.) with comments, unquoted keys, multi-line strings, trailing commas, optional commas, and more
4
4
 
5
5
 
6
- * home :: [github.com/datatxt/jasony](https://github.com/datatxt/jasony)
7
- * bugs :: [github.com/datatxt/jasony/issues](https://github.com/datatxt/jasony/issues)
8
- * gem :: [rubygems.org/gems/jasony](https://rubygems.org/gems/jasony)
9
- * rdoc :: [rubydoc.info/gems/jasony](http://rubydoc.info/gems/jasony)
6
+ * home :: [github.com/datatxt/json-next](https://github.com/datatxt/json-next)
7
+ * bugs :: [github.com/datatxt/json-next/issues](https://github.com/datatxt/json-next/issues)
8
+ * gem :: [rubygems.org/gems/json-next](https://rubygems.org/gems/json-next)
9
+ * rdoc :: [rubydoc.info/gems/json-next](http://rubydoc.info/gems/json-next)
10
10
 
11
11
 
12
12
 
13
13
 
14
- ## Usage - `HANSON.parse`, `SON.parse`
14
+ ## Usage - `HANSON.parse`, `SON.parse`, `JSONX.parse`
15
15
 
16
16
  [HanSON](#hanson) •
17
- [SON](#son)
17
+ [SON](#son)
18
+ [JSONX](#jsonx)
18
19
 
19
20
 
20
21
  ### HanSON
@@ -153,12 +154,93 @@ Use `SON.parse` instead of `JSON.parse` to parse text to ruby hash / array / etc
153
154
  ```
154
155
 
155
156
 
157
+ ### JSONX
158
+
159
+ _JSON with Extensions or JSON v1.1 (a.k.a. JSON11 or JSON XI or JSON II)_
160
+
161
+ Includes all JSON extensions from HanSON:
162
+
163
+ - quotes for strings are optional if they follow JavaScript identifier rules.
164
+ - you can alternatively use backticks, as in ES6's template string literal, as quotes for strings.
165
+ A backtick-quoted string may span several lines and you are not required to escape regular quote characters,
166
+ only backticks. Backslashes still need to be escaped, and all other backslash-escape sequences work like in
167
+ regular JSON.
168
+ - for single-line strings, single quotes (`''`) are supported in addition to double quotes (`""`)
169
+ - you can use JavaScript comments, both single line (`//`) and multi-line comments (`/* */`), in all places where JSON allows whitespace.
170
+ - Commas after the last list element or object property will be ignored.
171
+
172
+ Plus all JSON extensions from SON:
173
+
174
+ - comments starts with `#` sign and ends with newline (`\n`)
175
+ - comma after an object key-value pair is optional
176
+ - comma after an array item is optional
177
+
178
+
179
+ Example:
180
+
181
+ ```
182
+ {
183
+ # use shell-like (or ruby-like) comments
184
+
185
+ listName: "Sesame Street Monsters" # note: comments after key-value pairs are optional
186
+ content: [
187
+ {
188
+ name: "Cookie Monster"
189
+ // note: the template quotes and unescaped regular quotes in the next string
190
+ background: `Cookie Monster used to be a
191
+ monster that ate everything, especially cookies.
192
+ These days he is forced to eat "healthy" food.`
193
+ }, {
194
+ // You can single-quote strings too:
195
+ name: 'Herry Monster',
196
+ background: `Herry Monster is a furry blue monster with a purple nose.
197
+ He's mostly retired today.`
198
+ }, /* don't worry, the trailing comma will be ignored */
199
+ ]
200
+ }
201
+ ```
202
+
203
+
204
+ Use `JSONX.convert` (or `JSONXI.convert` or `JSON11.convert` or `JSONII.convert`) to convert JSONX text to ye old' JSON text:
205
+
206
+
207
+ ``` json
208
+ {
209
+ "listName": "Sesame Street Monsters",
210
+ "content": [
211
+ { "name": "Cookie Monster",
212
+ "background": "Cookie Monster used to be a\n ... to eat \"healthy\" food."
213
+ },
214
+ { "name": "Herry Monster",
215
+ "background": "Herry Monster is a furry blue monster with a purple nose.\n ... today."
216
+ }
217
+ ]
218
+ }
219
+ ```
220
+
221
+ Use `JSONX.parse` (or `JSONXI.parse` or `JSON11.parse` or `JSONII.parse`) instead of `JSON.parse` to parse text to ruby hash / array / etc.:
222
+
223
+ ``` ruby
224
+ {
225
+ "listName" => "Sesame Street Monsters",
226
+ "content" => [
227
+ { "name" => "Cookie Monster",
228
+ "background" => "Cookie Monster used to be a\n ... to eat \"healthy\" food."
229
+ },
230
+ { "name" => "Herry Monster",
231
+ "background" => "Herry Monster is a furry blue monster with a purple nose.\n ... today."
232
+ }
233
+ ]
234
+ }
235
+ ```
236
+
237
+
156
238
 
157
239
  ### Live Examples
158
240
 
159
241
 
160
242
  ``` ruby
161
- require 'jasony'
243
+ require 'json/next'
162
244
 
163
245
  text1 =<<TXT
164
246
  {
@@ -236,6 +318,53 @@ resulting in:
236
318
  }
237
319
  ```
238
320
 
321
+ and
322
+
323
+ ``` ruby
324
+ text3 =<<TXT
325
+ {
326
+ # use shell-like (or ruby-like) comments
327
+
328
+ listName: "Sesame Street Monsters" # note: comments after key-value pairs are optional
329
+ content: [
330
+ {
331
+ name: "Cookie Monster"
332
+ // note: the template quotes and unescaped regular quotes in the next string
333
+ background: `Cookie Monster used to be a
334
+ monster that ate everything, especially cookies.
335
+ These days he is forced to eat "healthy" food.`
336
+ }, {
337
+ // You can single-quote strings too:
338
+ name: 'Herry Monster',
339
+ background: `Herry Monster is a furry blue monster with a purple nose.
340
+ He's mostly retired today.`
341
+ }, /* don't worry, the trailing comma will be ignored */
342
+ ]
343
+ }
344
+ TXT
345
+
346
+ pp JSONX.parse( text3 ) # note: is the same as JSON.parse( JSONX.convert( text ))
347
+ pp JSONXI.parse( text3 ) # note: is the same as JSON.parse( JSONXI.convert( text ))
348
+ pp JSON11.parse( text3 ) # note: is the same as JSON.parse( JSON11.convert( text ))
349
+ pp JSONII.parse( text3 ) # note: is the same as JSON.parse( JSONII.convert( text ))
350
+ ```
351
+
352
+ resulting in:
353
+
354
+ ``` ruby
355
+ {
356
+ "listName" => "Sesame Street Monsters",
357
+ "content" => [
358
+ { "name" => "Cookie Monster",
359
+ "background" => "Cookie Monster used to be a\n ... to eat \"healthy\" food."
360
+ },
361
+ { "name" => "Herry Monster",
362
+ "background" => "Herry Monster is a furry blue monster with a purple nose.\n ... today."
363
+ }
364
+ ]
365
+ }
366
+ ```
367
+
239
368
 
240
369
 
241
370
  ## More JSON Formats
@@ -248,7 +377,7 @@ See the [Awesome JSON (What's Next?)](https://github.com/datatxt/awesome-json-ne
248
377
 
249
378
  ![](https://publicdomainworks.github.io/buttons/zero88x31.png)
250
379
 
251
- The `jasony` scripts are dedicated to the public domain.
380
+ The `json-next` scripts are dedicated to the public domain.
252
381
  Use it as you please with no restrictions whatsoever.
253
382
 
254
383
  ## Questions? Comments?
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ Hoe.spec 'json-next' do
5
5
 
6
6
  self.version = JSON::Next::VERSION
7
7
 
8
- self.summary = 'json-next - read generation y / next generation json versions (HanSON, SON, etc.) with comments, unquoted keys, multi-line strings, trailing commas, optional commas, and more'
8
+ self.summary = 'json-next - read generation y / next generation json versions (HanSON, SON, JSONX/JSON11, etc.) with comments, unquoted keys, multi-line strings, trailing commas, optional commas, and more'
9
9
  self.description = summary
10
10
 
11
11
  self.urls = ['https://github.com/datatxt/json-next']
@@ -12,6 +12,7 @@ require 'json/next/commata'
12
12
 
13
13
  require 'json/next/parser/hanson'
14
14
  require 'json/next/parser/son'
15
+ require 'json/next/parser/jsonx'
15
16
 
16
17
 
17
18
 
@@ -38,7 +38,7 @@ def parse_string
38
38
 
39
39
  if @buffer.peek(1) == '"' ## double quote
40
40
  @buffer.getch # consume double quote
41
- value = @buffer.scan_until( /(?=")/) ## fix: allow escaped double quote e.g. \" too!!!
41
+ value = @buffer.scan( /(\\.|[^"])*/ )
42
42
  @buffer.getch # consume double quote
43
43
 
44
44
  puts %{string value >>#{value}<<} if debug?
@@ -0,0 +1,108 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ ##
5
+ ## JSON with Extensions (JSONX) or
6
+ ## JSON 1.1 - JSON XI
7
+
8
+
9
+
10
+ module JSONX
11
+
12
+
13
+ BACKTICK_ML_QUOTE = JSON::Next::BACKTICK_ML_QUOTE
14
+ SINGLE_QUOTE = JSON::Next::SINGLE_QUOTE
15
+ DOUBLE_QUOTE = JSON::Next::DOUBLE_QUOTE
16
+
17
+ CLANG_ML_COMMENT = JSON::Next::CLANG_ML_COMMENT
18
+ CLANG_COMMENT = JSON::Next::CLANG_COMMENT
19
+ SHELL_COMMENT = JSON::Next::SHELL_COMMENT
20
+
21
+ KEYWORDS = JSON::Next::KEYWORDS
22
+ IDENTIFIER = JSON::Next::IDENTIFIER
23
+ TRAILING_COMMA = JSON::Next::TRAILING_COMMA
24
+
25
+ UNESCAPE_MAP = JSON::Next::UNESCAPE_MAP
26
+ ML_ESCAPE_MAP = JSON::Next::ML_ESCAPE_MAP
27
+
28
+
29
+
30
+ def self.strip_comments( text ) ## pass 1
31
+ text.gsub( /#{BACKTICK_ML_QUOTE}|#{SINGLE_QUOTE}|#{DOUBLE_QUOTE}|#{SHELL_COMMENT}|#{CLANG_ML_COMMENT}|#{CLANG_COMMENT}/ox ) do |match|
32
+ ## puts "match: >>#{match}<< : #{match.class.name}"
33
+ if match[0] == ?/ || match[0] == ?# ## comments start with // or /* or #
34
+ ## puts "!!! removing comments"
35
+ '' ## remove / strip comments
36
+ else
37
+ match
38
+ end
39
+ end
40
+ end
41
+
42
+
43
+ ### note: same as hanson (see parser/hanson.rb)
44
+ def self.normalize_quotes( text ) ## pass 2
45
+ text.gsub( /#{BACKTICK_ML_QUOTE}|#{SINGLE_QUOTE}|#{DOUBLE_QUOTE}/ox ) do |match|
46
+ ## puts "match: >>#{match}<< : #{match.class.name}"
47
+
48
+ m = Regexp.last_match
49
+ if m[:backtick_ml_quote]
50
+ ## puts "!!! ml_quote -- convert to double quotes"
51
+ str = m[:backtick_ml_quote]
52
+ str = str.gsub( /\\./ ) {|r| UNESCAPE_MAP[r] || r }
53
+ str = str.gsub( /[\n\r\t"]/ ) { |r| ML_ESCAPE_MAP[r] }
54
+ '"' + str + '"'
55
+ elsif m[:single_quote]
56
+ ## puts "!!! single_quote -- convert to double quotes"
57
+ str = m[:single_quote]
58
+ str = str.gsub( /\\./ ) {|r| UNESCAPE_MAP[r] || r }
59
+ str = str.gsub( /"/, %{\\"} )
60
+ '"' + str + '"'
61
+ else
62
+ match
63
+ end
64
+ end
65
+ end
66
+
67
+
68
+ def self.convert( text )
69
+
70
+ ## pass 1: remove/strip comments
71
+ text = strip_comments( text )
72
+
73
+ ## pass 2: requote/normalize quotes
74
+ text = normalize_quotes( text )
75
+
76
+ ## pass 3: quote unquoted and remove trailing commas
77
+ text = text.gsub( /#{KEYWORDS}|#{IDENTIFIER}|#{DOUBLE_QUOTE}|#{TRAILING_COMMA}/ox ) do |match|
78
+ ## puts "match: >>#{match}<< : #{match.class.name}"
79
+
80
+ m = Regexp.last_match
81
+ if m[:identifier]
82
+ ## puts "!!! identfier -- wrap in double quotes"
83
+ '"' + m[:identifier] + '"'
84
+ elsif m[:trailing_comma]
85
+ ## puts "!!! trailing comma -- remove"
86
+ ''
87
+ else
88
+ match
89
+ end
90
+ end
91
+
92
+ ## pass 4 - auto-add (missing optional) commas
93
+ text = JSON::Next::Commata.convert( text )
94
+ text
95
+ end
96
+
97
+
98
+ def self.parse( text )
99
+ JSON.parse( self.convert( text ) )
100
+ end
101
+
102
+ end # module JSONX
103
+
104
+ ## add some aliases
105
+
106
+ JSONXI = JSONX
107
+ JSONII = JSONX
108
+ JSON11 = JSONX
@@ -4,7 +4,7 @@ module JSON
4
4
  module Next
5
5
 
6
6
  MAJOR = 1 ## todo: namespace inside version or something - why? why not??
7
- MINOR = 1
7
+ MINOR = 2
8
8
  PATCH = 0
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "Alexander Grothendieck"
3
+ "fields": "mathematics"
4
+ "main_topics": [
5
+ "Etale cohomology"
6
+ "Motives"
7
+ "Topos theory"
8
+ "Schemes"
9
+ ]
10
+ }
11
+
12
+ ---
13
+
14
+ {
15
+ "name" => "Alexander Grothendieck",
16
+ "fields" => "mathematics",
17
+ "main_topics" =>
18
+ ["Etale cohomology", "Motives", "Topos theory", "Schemes"]
19
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "nested": {
3
+ "name": "Alexander Grothendieck"
4
+ "fields": "mathematics"
5
+ "array": ["one" "two"] }
6
+ "numbers": [1 2 3 4 5]
7
+ "more_numbers": [1.1 2.0 0.3 4.444 -5.1]
8
+ "mixed": [1 true false null]
9
+ }
10
+
11
+
12
+ ---
13
+
14
+ {
15
+ "nested" => {
16
+ "name" => "Alexander Grothendieck",
17
+ "fields" => "mathematics",
18
+ "array" => ["one", "two"]
19
+ },
20
+ "numbers" => [1, 2, 3, 4, 5],
21
+ "more_numbers" => [1.1, 2.0, 0.3, 4.444, -5.1],
22
+ "mixed" => [1, true, false, nil]
23
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "nested": {
3
+ "name": "Alexander Grothendieck",
4
+ "fields": "mathematics",
5
+ "array": ["one", "two"] },
6
+ "numbers": [1, 2, 3, 4, 5],
7
+ "more_numbers": [1.1, 2.0, 0.3, 4.444, -5.1],
8
+ "mixed": [1, true, false, null]
9
+ }
10
+
11
+ ---
12
+
13
+ {
14
+ "nested" => {
15
+ "name" => "Alexander Grothendieck",
16
+ "fields" => "mathematics",
17
+ "array" => ["one", "two"]
18
+ },
19
+ "numbers" => [1, 2, 3, 4, 5],
20
+ "more_numbers" => [1.1, 2.0, 0.3, 4.444, -5.1],
21
+ "mixed" => [1, true, false, nil]
22
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ listName: "Sesame Street Monsters", // note that listName needs no quotes
3
+ content: [
4
+ {
5
+ name: "Cookie Monster",
6
+ /* Note the template quotes and unescaped regular quotes in the next string */
7
+ background: `Cookie Monster used to be a
8
+ monster that ate everything, especially cookies.
9
+ These days he is forced to eat "healthy" food.`
10
+ }, {
11
+ // You can single-quote strings too:
12
+ name: 'Herry Monster',
13
+ background: `Herry Monster is a furry blue monster with a purple nose.
14
+ He's mostly retired today.`
15
+ }, // don't worry, the trailing comma will be ignored
16
+ ]
17
+ }
18
+
19
+ ---
20
+
21
+ {
22
+ "listName" => "Sesame Street Monsters",
23
+ "content" =>
24
+ [{"name" => "Cookie Monster",
25
+ "background" =>
26
+ "Cookie Monster used to be a\nmonster that ate everything, especially cookies.\nThese days he is forced to eat \"healthy\" food."},
27
+ {"name" => "Herry Monster",
28
+ "background" =>
29
+ "Herry Monster is a furry blue monster with a purple nose.\nHe's mostly retired today."}
30
+ ]
31
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ # use shell-like comments
3
+ # note: all commas optional
4
+
5
+ listName: "Sesame Street Monsters" // note that listName needs no quotes
6
+ content: [
7
+ {
8
+ name: "Cookie Monster"
9
+ /* Note the template quotes and unescaped regular quotes in the next string */
10
+ background: `Cookie Monster used to be a
11
+ monster that ate everything, especially cookies.
12
+ These days he is forced to eat "healthy" food.`
13
+ } {
14
+ // You can single-quote strings too:
15
+ name: 'Herry Monster'
16
+ background: `Herry Monster is a furry blue monster with a purple nose.
17
+ He's mostly retired today.`
18
+ }
19
+ ]
20
+ }
21
+
22
+ ---
23
+
24
+ {
25
+ "listName" => "Sesame Street Monsters",
26
+ "content" =>
27
+ [{"name" => "Cookie Monster",
28
+ "background" =>
29
+ "Cookie Monster used to be a\nmonster that ate everything, especially cookies.\nThese days he is forced to eat \"healthy\" food."},
30
+ {"name" => "Herry Monster",
31
+ "background" =>
32
+ "Herry Monster is a furry blue monster with a purple nose.\nHe's mostly retired today."}
33
+ ]
34
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ listName: "Sesame Street Monsters" # note that listName needs no quotes
3
+ content: [
4
+ {
5
+ name: "Cookie Monster"
6
+ /* Note the template quotes and unescaped regular quotes in the next string */
7
+ background: `Cookie Monster used to be a
8
+ monster that ate everything, especially cookies.
9
+ These days he is forced to eat "healthy" food.`
10
+ }, {
11
+ # You can single-quote strings too:
12
+ name: 'Herry Monster',
13
+ background: `Herry Monster is a furry blue monster with a purple nose.
14
+ He's mostly retired today.`
15
+ }, /* don't worry, the trailing comma will be ignored */
16
+ ]
17
+ }
18
+
19
+ ---
20
+
21
+ {
22
+ "listName" => "Sesame Street Monsters",
23
+ "content" =>
24
+ [{"name" => "Cookie Monster",
25
+ "background" =>
26
+ "Cookie Monster used to be a\nmonster that ate everything, especially cookies.\nThese days he is forced to eat \"healthy\" food."},
27
+ {"name" => "Herry Monster",
28
+ "background" =>
29
+ "Herry Monster is a furry blue monster with a purple nose.\nHe's mostly retired today."}
30
+ ]
31
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ # Personal information
3
+
4
+ "name": "Alexander Grothendieck"
5
+ "fields": "mathematics"
6
+ "main_topics": [
7
+ "Etale cohomology"
8
+ "Motives"
9
+ "Topos theory"
10
+ "Schemes"
11
+ ]
12
+ }
13
+
14
+ ---
15
+
16
+ {
17
+ "name" => "Alexander Grothendieck",
18
+ "fields" => "mathematics",
19
+ "main_topics" =>
20
+ ["Etale cohomology", "Motives", "Topos theory", "Schemes"]
21
+ }
@@ -8,3 +8,33 @@ $RUBYLIBS_DEBUG = true
8
8
 
9
9
  ## our own code
10
10
  require 'json/next'
11
+
12
+
13
+
14
+
15
+ class TestBlockFile
16
+ def self.read_utf8( path )
17
+ BlockFile.read_utf8( "#{JSON::Next.root}/test/data/#{path}.txt" )
18
+ end
19
+ end
20
+
21
+
22
+ class BlockFile
23
+ def self.read_utf8( path )
24
+ text = File.open( path, 'r:bom|utf-8' ).read
25
+ reader = BlockReader.new( text )
26
+ reader.blocks
27
+ end
28
+ end
29
+
30
+
31
+ class BlockReader
32
+
33
+ attr_reader :blocks
34
+
35
+ def initialize( text )
36
+ ## split blocks by ---
37
+ @blocks = text.split( /^\s*---\s*$/ )
38
+ end
39
+
40
+ end ## block reader
@@ -12,81 +12,27 @@ class TestCommata < MiniTest::Test
12
12
 
13
13
  def test_commata
14
14
 
15
- sample1a =<<TXT
16
- {
17
- "name": "Alexander Grothendieck"
18
- "fields": "mathematics"
19
- "main_topics": [
20
- "Etale cohomology"
21
- "Motives"
22
- "Topos theory"
23
- "Schemes"
24
- ]
25
- }
26
- TXT
27
-
28
- exp_sample1b = {
29
- "name" => "Alexander Grothendieck",
30
- "fields" => "mathematics",
31
- "main_topics" =>
32
- ["Etale cohomology", "Motives", "Topos theory", "Schemes"]
33
- }
34
-
35
-
36
- sample2a =<<TXT
37
- {
38
- "nested": {
39
- "name": "Alexander Grothendieck"
40
- "fields": "mathematics"
41
- "array": ["one" "two"] }
42
- "numbers": [1 2 3 4 5]
43
- "more_numbers": [1.1 2.0 0.3 4.444 -5.1]
44
- "mixed": [1 true false null]
45
- }
46
- TXT
47
-
48
- sample2a1 =<<TXT
49
- {
50
- "nested": {
51
- "name": "Alexander Grothendieck",
52
- "fields": "mathematics",
53
- "array": ["one", "two"] },
54
- "numbers": [1, 2, 3, 4, 5],
55
- "more_numbers": [1.1, 2.0, 0.3, 4.444, -5.1],
56
- "mixed": [1, true, false, null]
57
- }
58
- TXT
59
-
60
-
61
-
62
- exp_sample2b = {
63
- "nested" => {
64
- "name" => "Alexander Grothendieck",
65
- "fields" => "mathematics",
66
- "array" => ["one", "two"]
67
- },
68
- "numbers" => [1, 2, 3, 4, 5],
69
- "more_numbers" => [1.1, 2.0, 0.3, 4.444, -5.1],
70
- "mixed" => [1, true, false, nil]
71
- }
72
-
73
-
74
- sample1b = JSON::Next::Commata.convert( sample1a, debug: true )
75
- puts sample1b
76
-
77
- assert_equal exp_sample1b, JSON.parse( sample1b )
78
-
79
-
80
- sample2b = JSON::Next::Commata.convert( sample2a, debug: true )
81
- puts sample2b
82
-
83
- assert_equal exp_sample2b, JSON.parse( sample2b )
84
-
85
-
86
- sample2b1 = JSON::Next::Commata.convert( sample2a1, debug: true )
87
- puts sample2b1
88
-
89
- assert_equal exp_sample2b, JSON.parse( sample2b1 )
15
+
16
+ sample1, exp1 = TestBlockFile.read_utf8( 'commata1' )
17
+ sample2a, exp2a = TestBlockFile.read_utf8( 'commata2a' )
18
+ sample2b, exp2b = TestBlockFile.read_utf8( 'commata2b' )
19
+
20
+ json1 = JSON::Next::Commata.convert( sample1, debug: true )
21
+ puts json1
22
+
23
+ assert_equal eval(exp1), JSON.parse( json1 )
24
+
25
+
26
+ json2a = JSON::Next::Commata.convert( sample2a, debug: true )
27
+ puts json2a
28
+
29
+ assert_equal eval(exp2a), JSON.parse( json2a )
30
+
31
+
32
+ json2b = JSON::Next::Commata.convert( sample2b, debug: true )
33
+ puts json2b
34
+
35
+ assert_equal eval(exp2b), JSON.parse( json2b )
90
36
  end
91
37
 
92
38
  end
@@ -11,42 +11,14 @@ require 'helper'
11
11
  class TestParser < MiniTest::Test
12
12
 
13
13
  def test_hanson
14
- exp_sample1 = {
15
- "listName"=>"Sesame Street Monsters",
16
- "content"=>
17
- [{"name"=>"Cookie Monster",
18
- "background"=> "Cookie Monster used to be a\n monster that ate everything, especially cookies.\n These days he is forced to eat \"healthy\" food."
19
- },
20
- {"name"=>"Herry Monster",
21
- "background"=> "Herry Monster is a furry blue monster with a purple nose.\n He's mostly retired today."
22
- }
23
- ]}
24
-
25
- sample1 =<<TXT
26
- {
27
- listName: "Sesame Street Monsters", // note that listName needs no quotes
28
- content: [
29
- {
30
- name: "Cookie Monster",
31
- /* Note the template quotes and unescaped regular quotes in the next string */
32
- background: `Cookie Monster used to be a
33
- monster that ate everything, especially cookies.
34
- These days he is forced to eat "healthy" food.`
35
- }, {
36
- // You can single-quote strings too:
37
- name: 'Herry Monster',
38
- background: `Herry Monster is a furry blue monster with a purple nose.
39
- He's mostly retired today.`
40
- }, // don't worry, the trailing comma will be ignored
41
- ]
42
- }
43
- TXT
14
+
15
+ sample1, exp1 = TestBlockFile.read_utf8( 'hanson1' )
44
16
 
45
17
  puts HANSON.convert( sample1 )
46
18
 
47
19
  pp HANSON.parse( sample1 )
48
20
 
49
- assert_equal exp_sample1, HANSON.parse( sample1 )
21
+ assert_equal eval( exp1 ), HANSON.parse( sample1 )
50
22
  end
51
23
 
52
24
  end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_parser_jsonx.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestParserJsonx < MiniTest::Test
12
+
13
+ def test_jsonx
14
+
15
+ sample1, exp1 = TestBlockFile.read_utf8( 'jsonx1' )
16
+
17
+ puts JSONX.convert( sample1 )
18
+
19
+ assert_equal eval(exp1), JSONX.parse( sample1 )
20
+
21
+
22
+ sample2, exp2 = TestBlockFile.read_utf8( 'jsonx2' )
23
+
24
+ puts JSONX.convert( sample2 )
25
+
26
+ assert_equal eval(exp2), JSONX.parse( sample2 )
27
+ end
28
+
29
+ end
@@ -11,31 +11,12 @@ require 'helper'
11
11
  class TestParserSon < MiniTest::Test
12
12
 
13
13
  def test_son
14
- exp_sample1 = {
15
- "name"=>"Alexander Grothendieck",
16
- "fields"=>"mathematics",
17
- "main_topics"=>
18
- ["Etale cohomology", "Motives", "Topos theory", "Schemes"]
19
- }
20
-
21
- sample1 =<<TXT
22
- {
23
- # Personal information
24
-
25
- "name": "Alexander Grothendieck"
26
- "fields": "mathematics"
27
- "main_topics": [
28
- "Etale cohomology"
29
- "Motives"
30
- "Topos theory"
31
- "Schemes"
32
- ]
33
- }
34
- TXT
14
+
15
+ sample1, exp1 = TestBlockFile.read_utf8( 'son1' )
35
16
 
36
17
  puts SON.convert( sample1 )
37
18
 
38
- assert_equal exp_sample1, SON.parse( sample1 )
19
+ assert_equal eval(exp1), SON.parse( sample1 )
39
20
  end
40
21
 
41
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-next
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
@@ -39,8 +39,8 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.15'
41
41
  description: json-next - read generation y / next generation json versions (HanSON,
42
- SON, etc.) with comments, unquoted keys, multi-line strings, trailing commas, optional
43
- commas, and more
42
+ SON, JSONX/JSON11, etc.) with comments, unquoted keys, multi-line strings, trailing
43
+ commas, optional commas, and more
44
44
  email: ruby-talk@ruby-lang.org
45
45
  executables: []
46
46
  extensions: []
@@ -56,12 +56,21 @@ files:
56
56
  - lib/json/next.rb
57
57
  - lib/json/next/commata.rb
58
58
  - lib/json/next/parser/hanson.rb
59
+ - lib/json/next/parser/jsonx.rb
59
60
  - lib/json/next/parser/son.rb
60
61
  - lib/json/next/pattern.rb
61
62
  - lib/json/next/version.rb
63
+ - test/data/commata1.txt
64
+ - test/data/commata2a.txt
65
+ - test/data/commata2b.txt
66
+ - test/data/hanson1.txt
67
+ - test/data/jsonx1.txt
68
+ - test/data/jsonx2.txt
69
+ - test/data/son1.txt
62
70
  - test/helper.rb
63
71
  - test/test_commata.rb
64
72
  - test/test_parser_hanson.rb
73
+ - test/test_parser_jsonx.rb
65
74
  - test/test_parser_son.rb
66
75
  - test/test_version.rb
67
76
  homepage: https://github.com/datatxt/json-next
@@ -90,6 +99,6 @@ rubygems_version: 2.6.7
90
99
  signing_key:
91
100
  specification_version: 4
92
101
  summary: json-next - read generation y / next generation json versions (HanSON, SON,
93
- etc.) with comments, unquoted keys, multi-line strings, trailing commas, optional
94
- commas, and more
102
+ JSONX/JSON11, etc.) with comments, unquoted keys, multi-line strings, trailing commas,
103
+ optional commas, and more
95
104
  test_files: []