tolerate_json 0.0.3 → 0.0.4
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 +15 -0
- data/.travis.yml +1 -1
- data/README.md +21 -10
- data/lib/tolerate_json.rb +42 -28
- data/lib/tolerate_json/version.rb +1 -1
- data/spec/lib/tolerate_json/formatter_spec.rb +104 -0
- data/spec/lib/tolerate_json_spec.rb +16 -71
- metadata +7 -13
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZDEyYzEyMzYxYTA4YjQzYmQ5NzcwOGIzYmE1M2E2MDg2ZjZkY2JkYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MGQwYzBiNTg3MzZkZWQ2YTM4ODliYzE1NzFkOTg2OWU5OWViYjY2Mg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NjczNzdkNjYwNTBlY2UxMTZmOGI0M2FkNzk1Yjg0Y2ZiNTYwNTIxMzMwNzQz
|
10
|
+
Nzg0MzU1M2RhMmY5NjczZDFiNDYzYTM3NDk4Yzc5ZTg3YzE0OWVkMDA1OWRk
|
11
|
+
Yjc2YjcxZDQyODM3NThmMDYzMTJhNGEyNDU4NTVmOWNkOGU0ZjA=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Y2NjZDJmOWI4NGJiZDFhOTE4ZGMzYjhkZWZlMWNlOWU2MDViNjVkNjljMTA4
|
14
|
+
ODMxNjFlMjE1N2MzNDI4MzJjNzNiZWNmZTE0YjU5OTFkNzgyNTYxZmEzZmYz
|
15
|
+
NTg1ZWYxNWVmMGE1NGNjM2EyODMzMWZhM2JiNjMwNjAwYjUxOWE=
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -12,28 +12,39 @@ It is a "90%" solution: it works in 90% of use cases, but will almost certainly
|
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
15
|
-
|
15
|
+
Either add `gem 'tolerate_json'` to your application's Gemfile and do `bundle install`, or install it manually with `gem install tolerate_json`
|
16
16
|
|
17
|
-
|
17
|
+
## Usage
|
18
18
|
|
19
|
-
|
19
|
+
### Include the module
|
20
20
|
|
21
|
-
|
21
|
+
```ruby
|
22
|
+
require 'rubygems' # optional on 1.9.3 and up
|
22
23
|
|
23
|
-
|
24
|
+
require 'tolerate_json'
|
24
25
|
|
25
|
-
|
26
|
+
include TolderateJson
|
26
27
|
|
27
|
-
|
28
|
+
puts pretty_print_json('{"foo":{"bar":"baz"}}')
|
29
|
+
|
30
|
+
# Prints:
|
31
|
+
#
|
32
|
+
# {
|
33
|
+
# "foo":{
|
34
|
+
# "bar":"baz"
|
35
|
+
# }
|
36
|
+
# }
|
37
|
+
#
|
38
|
+
```
|
39
|
+
|
40
|
+
### Use it directly from the class
|
28
41
|
|
29
42
|
```ruby
|
30
43
|
require 'rubygems' # optional on 1.9.3 and up
|
31
44
|
|
32
45
|
require 'tolerate_json'
|
33
46
|
|
34
|
-
|
35
|
-
|
36
|
-
puts pretty_print_json('{"foo":{"bar":"baz"}}')
|
47
|
+
puts TolderateJson.pretty_print_json('{"foo":{"bar":"baz"}}')
|
37
48
|
|
38
49
|
# Prints:
|
39
50
|
#
|
data/lib/tolerate_json.rb
CHANGED
@@ -1,42 +1,56 @@
|
|
1
1
|
require "tolerate_json/version"
|
2
2
|
|
3
3
|
module TolerateJson
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
module Formatter
|
5
|
+
def self.format_json_string(json, indentation_character=nil)
|
6
|
+
indentation_character ||= ' '
|
7
|
+
return json if json.to_s.size < 1
|
8
|
+
|
9
|
+
json.gsub!("\r\n", '')
|
10
|
+
json.gsub!("\n", '')
|
11
|
+
json.gsub!("\r", '')
|
12
|
+
|
13
|
+
if json.match(/[^\n]\}$/)
|
14
|
+
json.gsub!(/\}$/, "\n}")
|
15
|
+
json.gsub!(/\}\}/, "}\n}")
|
16
|
+
end
|
10
17
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
18
|
+
if json.match(/[^\n]\]$/)
|
19
|
+
json.gsub!(/\]$/, "\n]")
|
20
|
+
end
|
15
21
|
|
16
|
-
|
17
|
-
json.gsub!(/\]$/, "\n]")
|
18
|
-
end
|
22
|
+
json = json.to_s.gsub(/\{[\s+]\"/, "{\"").gsub(/\{(\s+)\"/, "{\"").gsub(/\"(\s+)\}/, "\"}").gsub(/true(\s+)\}/, "true}").gsub(/false(\s+)\}/, "false}").gsub(/\",(\s+)\"/, '","')
|
19
23
|
|
20
|
-
|
24
|
+
json = json.gsub("},", "},\n").gsub("],", "],\n").gsub("{[", "{\n[").gsub("}]", "}\n]").gsub("[{", "[\n{").gsub("]}", "]\n}").gsub("{\"", "{\n\"").gsub("\"}", "\"\n}").gsub("\",\"", "\",\n\"").gsub(":true,\"", ":true,\n\"").gsub(":false,\"", ":false,\n\"").gsub(":true}", ":true\n}").gsub(":false}", ":false\n}").gsub(/:(\d+)}/) { ":#{$1}\n}" }.gsub(/\:(\d+),\"/) { ":#{$1},\n\"" }.gsub(/\:(\d+),\"/,":\1,\n\"")
|
21
25
|
|
22
|
-
|
26
|
+
# don't put a CR in empty arrays
|
27
|
+
json = json.gsub(/\[\n\s*\]/, '[]')
|
23
28
|
|
24
|
-
|
29
|
+
output = []
|
25
30
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
indent_level = 0
|
32
|
+
json.split("\n").each do |s|
|
33
|
+
indent_level -= 1 if ["]", "}"].include?(s.split('').first) && indent_level > 0
|
34
|
+
output << (indentation_character*indent_level) + s
|
35
|
+
if ["{", "["].include?(s.split('').last)
|
36
|
+
indent_level += 1
|
37
|
+
next
|
38
|
+
end
|
34
39
|
|
35
|
-
|
36
|
-
|
37
|
-
|
40
|
+
if ["{", "["].include?(s.split('').first)
|
41
|
+
indent_level += 1
|
42
|
+
next
|
43
|
+
end
|
38
44
|
end
|
45
|
+
output.join("\n")+"\n"
|
39
46
|
end
|
40
|
-
|
47
|
+
end
|
48
|
+
|
49
|
+
def pretty_print_json(json, indentation_character=nil)
|
50
|
+
TolerateJson::Formatter.format_json_string(json, indentation_character)
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.pretty_print_json(json, indentation_character=nil)
|
54
|
+
TolerateJson::Formatter.format_json_string(json, indentation_character)
|
41
55
|
end
|
42
56
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tolerate_json'
|
3
|
+
|
4
|
+
describe TolerateJson::Formatter do
|
5
|
+
|
6
|
+
describe "pretty_print_json" do
|
7
|
+
|
8
|
+
it "should format simple json" do
|
9
|
+
unformatted = '{"foo":"bar"}'
|
10
|
+
formatted= "{\n \"foo\":\"bar\"\n}\n"
|
11
|
+
|
12
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should format complex json" do
|
16
|
+
unformatted = '{"foo":"bar","boolean":true,"Numbers":12345,"baz":"quz"}'
|
17
|
+
formatted= "{\n \"foo\":\"bar\",\n \"boolean\":true,\n \"Numbers\":12345,\n \"baz\":\"quz\"\n}\n"
|
18
|
+
|
19
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'arrays' do
|
23
|
+
context 'array is empty' do
|
24
|
+
it "should not add a cr between the square braces of an empty array" do
|
25
|
+
unformatted = "{\"foo\":[]}"
|
26
|
+
formatted= "{\n \"foo\":[]\n}\n"
|
27
|
+
|
28
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'array is not empty' do
|
33
|
+
it "should put the last square bracket on its own line" do
|
34
|
+
unformatted = '["foo", "bar", "baz"]'
|
35
|
+
formatted= "[\"foo\",\n \"bar\",\n \"baz\"\n]\n"
|
36
|
+
|
37
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'hashes' do
|
43
|
+
context 'hash is empty' do
|
44
|
+
it "should not add a cr between the curly braces of an empty hash" do
|
45
|
+
unformatted = "{\"foo\":{}}"
|
46
|
+
formatted= "{\n \"foo\":{}\n}\n"
|
47
|
+
|
48
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'hash is not empty' do
|
53
|
+
it "should put the last curly brace on its own line" do
|
54
|
+
unformatted = '{"foo":"bar"}'
|
55
|
+
formatted= "{\n \"foo\":\"bar\"\n}\n"
|
56
|
+
|
57
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should indent nested structures" do
|
63
|
+
unformatted = '{"foo":{"bar":"baz"}}'
|
64
|
+
formatted= "{\n \"foo\":{\n \"bar\":\"baz\"\n }\n}\n"
|
65
|
+
|
66
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should separate concurrant curly braces with a cr" do
|
70
|
+
unformatted = '{"qux":{"foo":{"bar":"baz"}}, "quux":"quuux"}'
|
71
|
+
formatted= "{\n \"qux\":{\n \"foo\":{\n \"bar\":\"baz\"\n }\n },\n \"quux\":\"quuux\"\n}\n"
|
72
|
+
|
73
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should separate numbers and closing curly braces with cr" do
|
77
|
+
unformatted = '{"qux":{"foo":1}, "quux":"quuux"}'
|
78
|
+
formatted= "{\n \"qux\":{\n \"foo\":1\n },\n \"quux\":\"quuux\"\n}\n"
|
79
|
+
|
80
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should include only one cr at the end of the result" do
|
84
|
+
unformatted = "{}\n\n\n"
|
85
|
+
formatted= "{\n}\n"
|
86
|
+
|
87
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should remove any newlines in the input" do
|
91
|
+
unformatted = "{\n\"foo\"\n:{\"bar\":\"baz\"}\n\n\n\n\n}"
|
92
|
+
formatted= "{\n \"foo\":{\n \"bar\":\"baz\"\n }\n}\n"
|
93
|
+
|
94
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should tolerate and format already-formatted json" do
|
98
|
+
unformatted = "{\n\t\"foo\":{\n\t\t\"bar\":\"baz\",\n\t\t\"qux\":true\n\t}\n}"
|
99
|
+
formatted= "{\n \"foo\":{\n \"bar\":\"baz\",\n \"qux\":true\n }\n}\n"
|
100
|
+
|
101
|
+
expect(subject.format_json_string(unformatted)).to eq(formatted)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -1,83 +1,28 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'tolerate_json'
|
3
3
|
|
4
|
-
class T
|
5
|
-
include TolerateJson
|
6
|
-
end
|
7
|
-
|
8
4
|
describe TolerateJson do
|
9
|
-
let(:t) { T.new }
|
10
|
-
|
11
|
-
describe "pretty_print_json" do
|
12
|
-
|
13
|
-
it "should format simple json" do
|
14
|
-
unformatted = '{"foo":"bar"}'
|
15
|
-
formatted= "{\n \"foo\":\"bar\"\n}\n"
|
16
|
-
|
17
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should format complex json" do
|
21
|
-
unformatted = '{"foo":"bar","boolean":true,"Numbers":12345,"baz":"quz"}'
|
22
|
-
formatted= "{\n \"foo\":\"bar\",\n \"boolean\":true,\n \"Numbers\":12345,\n \"baz\":\"quz\"\n}\n"
|
23
|
-
|
24
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should put the last curly brace on its own line" do
|
28
|
-
unformatted = '{}'
|
29
|
-
formatted= "{\n}\n"
|
30
|
-
|
31
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should put the last suqre bracket on its own line" do
|
35
|
-
unformatted = '[]'
|
36
|
-
formatted= "[\n]\n"
|
37
|
-
|
38
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
39
|
-
end
|
40
5
|
|
41
|
-
|
42
|
-
|
43
|
-
formatted= "{\n \"foo\":{\n \"bar\":\"baz\"\n }\n}\n"
|
6
|
+
let(:json) { double(:json_string) }
|
7
|
+
let(:indentation_string) { "\t" }
|
44
8
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
unformatted = '{"qux":{"foo":{"bar":"baz"}}, "quux":"quuux"}'
|
50
|
-
formatted= "{\n \"qux\":{\n \"foo\":{\n \"bar\":\"baz\"\n }\n },\n \"quux\":\"quuux\"\n}\n"
|
51
|
-
|
52
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should separate numbers and closing curly braces with cr" do
|
56
|
-
unformatted = '{"qux":{"foo":1}, "quux":"quuux"}'
|
57
|
-
formatted= "{\n \"qux\":{\n \"foo\":1\n },\n \"quux\":\"quuux\"\n}\n"
|
58
|
-
|
59
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should include only one cr at the end of the result" do
|
63
|
-
unformatted = "{}\n\n\n"
|
64
|
-
formatted= "{\n}\n"
|
65
|
-
|
66
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should remove any newlines in the input" do
|
70
|
-
unformatted = "{\n\"foo\"\n:{\"bar\":\"baz\"}\n\n\n\n\n}"
|
71
|
-
formatted= "{\n \"foo\":{\n \"bar\":\"baz\"\n }\n}\n"
|
72
|
-
|
73
|
-
expect(t.pretty_print_json(unformatted)).to eq(formatted)
|
9
|
+
describe '.pretty_print_json' do
|
10
|
+
it 'calls TolerateJson::Formatter' do
|
11
|
+
expect(TolerateJson::Formatter).to receive(:format_json_string).with(json, indentation_string)
|
12
|
+
TolerateJson.pretty_print_json(json, indentation_string)
|
74
13
|
end
|
14
|
+
end
|
75
15
|
|
76
|
-
|
77
|
-
|
78
|
-
|
16
|
+
|
17
|
+
describe '#pretty_print_json' do
|
18
|
+
it 'calls TolerateJson::Formatter' do
|
19
|
+
class T
|
20
|
+
include TolerateJson
|
21
|
+
end
|
22
|
+
t = T.new
|
79
23
|
|
80
|
-
expect(
|
24
|
+
expect(TolerateJson::Formatter).to receive(:format_json_string).with(json, indentation_string)
|
25
|
+
t.pretty_print_json(json, indentation_string)
|
81
26
|
end
|
82
27
|
end
|
83
28
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tolerate_json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matthew Nielsen
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-01-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -77,33 +70,33 @@ files:
|
|
77
70
|
- Rakefile
|
78
71
|
- lib/tolerate_json.rb
|
79
72
|
- lib/tolerate_json/version.rb
|
73
|
+
- spec/lib/tolerate_json/formatter_spec.rb
|
80
74
|
- spec/lib/tolerate_json_spec.rb
|
81
75
|
- spec/spec_helper.rb
|
82
76
|
- tolerate_json.gemspec
|
83
77
|
homepage: https://github.com/xunker/tolerate_json
|
84
78
|
licenses:
|
85
79
|
- MIT
|
80
|
+
metadata: {}
|
86
81
|
post_install_message:
|
87
82
|
rdoc_options: []
|
88
83
|
require_paths:
|
89
84
|
- lib
|
90
85
|
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
86
|
requirements:
|
93
87
|
- - ! '>='
|
94
88
|
- !ruby/object:Gem::Version
|
95
89
|
version: '0'
|
96
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
91
|
requirements:
|
99
92
|
- - ! '>='
|
100
93
|
- !ruby/object:Gem::Version
|
101
94
|
version: '0'
|
102
95
|
requirements: []
|
103
96
|
rubyforge_project:
|
104
|
-
rubygems_version:
|
97
|
+
rubygems_version: 2.2.2
|
105
98
|
signing_key:
|
106
|
-
specification_version:
|
99
|
+
specification_version: 4
|
107
100
|
summary: Tolerate_json is a pure-ruby Json formatter that has no outside gem dependencies.
|
108
101
|
It almost works right and is good enough so you can tolerate reading JSON from your
|
109
102
|
screen (hence the name). It is designed to be a simple formatter for when you need
|
@@ -111,5 +104,6 @@ summary: Tolerate_json is a pure-ruby Json formatter that has no outside gem dep
|
|
111
104
|
is mission-critical. Compatible with MRI 1.8.7, 1.9.3 and 2.0.0 as well as JRuby
|
112
105
|
and Rubinius in those modes.
|
113
106
|
test_files:
|
107
|
+
- spec/lib/tolerate_json/formatter_spec.rb
|
114
108
|
- spec/lib/tolerate_json_spec.rb
|
115
109
|
- spec/spec_helper.rb
|