json-minify 0.0.2 → 0.0.3
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 +4 -4
- data/Rakefile +1 -1
- data/json-minify.gemspec +11 -11
- data/lib/json/minify.rb +8 -6
- data/lib/json/minify/repairer.rb +83 -0
- data/lib/json/minify/version.rb +1 -1
- data/spec/minify_repairer_spec.rb +24 -0
- data/spec/minify_spec.rb +14 -14
- metadata +19 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f59536b9ca22b0f66e6d56ddddf3ad4463b00306
|
4
|
+
data.tar.gz: 457e5b20f346292efbb79673dad976cd66758e0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e7d87ff3d41f7cc9955605b6b8bdd8a18510fea314f536101664a98d7ce7530e031cf877d938b7db6db980c1505584c64245db5fa8fe44d63149eab5af75cf7
|
7
|
+
data.tar.gz: 9017ab6ea18c659dc348fbd88759a2943186ed7e4e01567df951dd834bc67572f2e1a0ded6b09a10ecf3c8652f0a6dc4b94872162a19997353ec48d37462442f
|
data/Rakefile
CHANGED
data/json-minify.gemspec
CHANGED
@@ -4,22 +4,22 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'json/minify/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'json-minify'
|
8
8
|
spec.version = JSON::Minify::VERSION
|
9
9
|
spec.authors = ["Geoff Youngs\n\n\n"]
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
12
|
-
spec.description =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
10
|
+
spec.email = ['git@intersect-uk.co.uk']
|
11
|
+
spec.summary = 'JSON.minify implementation'
|
12
|
+
spec.description = 'Pre-parser for JSON that removes C/C++ style comments and whitespace from formatted JSON, similar to https://github.com/getify/JSON.minify.'
|
13
|
+
spec.homepage = 'http://github.com/geoffyoungs/json-minify-rb'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_dependency
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.5'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.1'
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3.2'
|
24
|
+
spec.add_dependency 'json', '> 0'
|
25
25
|
end
|
data/lib/json/minify.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
require 'strscan'
|
2
2
|
require 'json'
|
3
|
-
require
|
3
|
+
require 'json/minify/version'
|
4
4
|
|
5
5
|
module JSON
|
6
6
|
module Minify
|
7
7
|
def self.included(mod)
|
8
8
|
mod.send(:extend, self)
|
9
9
|
end
|
10
|
+
|
10
11
|
def minify(str)
|
11
|
-
ss
|
12
|
+
ss = StringScanner.new(str)
|
13
|
+
buf = ''
|
12
14
|
|
13
15
|
until ss.eos?
|
14
16
|
# Remove whitespace
|
15
17
|
if s = ss.scan(/\s+/)
|
16
|
-
|
18
|
+
|
17
19
|
# Scan punctuation
|
18
20
|
elsif s = ss.scan(/[{},:\]\[]/)
|
19
21
|
buf << s
|
@@ -31,12 +33,12 @@ module JSON
|
|
31
33
|
buf << s
|
32
34
|
|
33
35
|
# Remove C++ style comments
|
34
|
-
elsif s = ss.scan(%r
|
36
|
+
elsif s = ss.scan(%r{//})
|
35
37
|
ss.scan_until(/(\r?\n|$)/)
|
36
38
|
|
37
39
|
# Remove C style comments
|
38
|
-
elsif s = ss.scan(%r
|
39
|
-
ss.scan_until(%r
|
40
|
+
elsif s = ss.scan(%r{/[*]})
|
41
|
+
ss.scan_until(%r{[*]/}) || raise(SyntaxError, "Unterminated /*...*/ comment - #{ss.rest}")
|
40
42
|
|
41
43
|
# Anything else is invalid JSON
|
42
44
|
else
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
require 'json'
|
3
|
+
require 'json/minify'
|
4
|
+
require 'json/minify/version'
|
5
|
+
|
6
|
+
module JSON
|
7
|
+
module Minify
|
8
|
+
#
|
9
|
+
class Repairer
|
10
|
+
TOKENS = {
|
11
|
+
/\s+/ => [:whitespace, :skip],
|
12
|
+
/[{},:\]\[]/ => [:punctuation, :keep],
|
13
|
+
/""|(".*?[^\\])?"/ => [:string, :keep],
|
14
|
+
/(true|false|null)/ => [:reserved, :keep],
|
15
|
+
/-?\d+([.]\d+)?([eE][-+]?[0-9]+)?/ => [:number, :keep],
|
16
|
+
%r{//.*?(\r?\n|$)} => [:comment, :skip],
|
17
|
+
%r{/[*].*?[*]/} => [:comment, :skip]
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
def self.combine(tokens, type)
|
21
|
+
regexes = tokens.map do |key, bits|
|
22
|
+
key if bits[1] == type
|
23
|
+
end.compact
|
24
|
+
Regexp.new(regexes.join('|'))
|
25
|
+
end
|
26
|
+
|
27
|
+
KEEP = combine(TOKENS, :keep)
|
28
|
+
SKIP = combine(TOKENS, :skip)
|
29
|
+
ALL = Regexp.new(TOKENS.keys.join('|'))
|
30
|
+
|
31
|
+
def initialize(str)
|
32
|
+
@str = str
|
33
|
+
end
|
34
|
+
|
35
|
+
def tokens
|
36
|
+
scanner, buf = StringScanner.new(@str), []
|
37
|
+
|
38
|
+
until scanner.eos?
|
39
|
+
token = scanner.scan(KEEP)
|
40
|
+
buf << token if token
|
41
|
+
skip = scanner.skip(SKIP)
|
42
|
+
|
43
|
+
# Anything else is invalid JSON
|
44
|
+
next if skip || token || scanner.eos?
|
45
|
+
|
46
|
+
cur = scanner.pos
|
47
|
+
extra = scanner.scan_until(ALL)
|
48
|
+
if extra
|
49
|
+
invalid_string = scanner.pre_match[cur..-1]
|
50
|
+
next_token = scanner.matched
|
51
|
+
buf << next_token if KEEP.match(next_token)
|
52
|
+
else
|
53
|
+
invalid_string = scanner.rest
|
54
|
+
end
|
55
|
+
|
56
|
+
alternate_token = transform(invalid_string)
|
57
|
+
if alternate_token
|
58
|
+
buf << alternate_token
|
59
|
+
else
|
60
|
+
raise SyntaxError, "Unable to pre-scan string: #{invalid_string}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
buf
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse
|
68
|
+
JSON.parse(tokens.join)
|
69
|
+
end
|
70
|
+
|
71
|
+
def transform(token)
|
72
|
+
case token
|
73
|
+
when 'NaN'
|
74
|
+
'0'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def minify_parse(buf)
|
79
|
+
JSON.parse(minify(buf))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/json/minify/version.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__) + '../lib'
|
2
|
+
|
3
|
+
require 'json/minify/repairer'
|
4
|
+
|
5
|
+
describe JSON::Minify::Repairer do
|
6
|
+
subject { described_class.new(sample) }
|
7
|
+
|
8
|
+
context 'with a NaN' do
|
9
|
+
let(:sample) { '{ "hello": NaN }' }
|
10
|
+
let(:tokens) { ['{', '"hello"', ':', '0', '}'] }
|
11
|
+
|
12
|
+
it 'should remove whitespace from JSON' do
|
13
|
+
expect(subject.tokens).to eql(tokens)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when parsing data' do
|
18
|
+
let(:sample) { '{ "hello": NaN }' }
|
19
|
+
|
20
|
+
it 'should remove whitespace from JSON' do
|
21
|
+
expect(subject.parse).to include('hello' => 0)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/minify_spec.rb
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__) + '../lib'
|
2
2
|
|
3
3
|
require 'json/minify'
|
4
4
|
|
5
5
|
describe JSON::Minify do
|
6
|
-
it
|
7
|
-
expect(JSON.minify(
|
8
|
-
expect(JSON.minify(%
|
6
|
+
it 'should remove whitespace from JSON' do
|
7
|
+
expect(JSON.minify('{ }')).to eql('{}')
|
8
|
+
expect(JSON.minify(%({"foo": "bar"\n}\n))).to eql(%({"foo":"bar"}))
|
9
9
|
end
|
10
10
|
|
11
|
-
it
|
12
|
-
expect(JSON.minify(
|
13
|
-
expect(JSON.minify(%
|
11
|
+
it 'should remove comments from JSON' do
|
12
|
+
expect(JSON.minify('{ /* foo */ } /* bar */')).to eql('{}')
|
13
|
+
expect(JSON.minify(%({"foo": "bar"\n}\n // this is a comment))).to eql(%({"foo":"bar"}))
|
14
14
|
end
|
15
15
|
|
16
|
-
it
|
17
|
-
expect { JSON.minify(
|
18
|
-
expect { JSON.minify(
|
16
|
+
it 'should throw a SyntaxError on invalid JSON' do
|
17
|
+
expect { JSON.minify('{ /* foo */ } /* bar ') }.to raise_error(SyntaxError)
|
18
|
+
expect { JSON.minify(%<{ "foo": new Date(1023) }>) }.to raise_error(SyntaxError)
|
19
19
|
end
|
20
20
|
|
21
|
-
it
|
22
|
-
expect(JSON.minify(
|
21
|
+
it 'should cope with the example from https://github.com/getify/JSON.minify' do
|
22
|
+
expect(JSON.minify(%({ /* comment */ "foo": 42 \n }))).to eql('{"foo":42}')
|
23
23
|
end
|
24
24
|
|
25
|
-
it
|
25
|
+
it 'should cope with the https://gist.github.com/mattheworiordan/72db0dfc933f743622eb' do
|
26
26
|
expect(JSON.minify('{ "PolicyName": { "Fn::Join" : [ "", [ "AblySnsPublish-", { "Ref" : "AWS::Region" }, "-", { "Ref" : "DataCenterID" } ] ] } }')).to \
|
27
27
|
eql('{"PolicyName":{"Fn::Join":["",["AblySnsPublish-",{"Ref":"AWS::Region"},"-",{"Ref":"DataCenterID"}]]}}')
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
30
|
+
it 'should cope with escaped double quoted strings' do
|
31
31
|
expect(JSON.minify('{ "Statement1": "he said \"no way\" to the dog", "Statement2": "she said \"really?\"" }')).to \
|
32
32
|
eql('{"Statement1":"he said \"no way\" to the dog","Statement2":"she said \"really?\""}')
|
33
33
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-minify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- |+
|
@@ -11,62 +11,62 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2016-09-30 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
18
18
|
requirement: !ruby/object:Gem::Requirement
|
19
19
|
requirements:
|
20
|
-
- - ~>
|
20
|
+
- - "~>"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '1.5'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - ~>
|
27
|
+
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '1.5'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rake
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
requirements:
|
34
|
-
- - ~>
|
34
|
+
- - "~>"
|
35
35
|
- !ruby/object:Gem::Version
|
36
36
|
version: '10.1'
|
37
37
|
type: :development
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- - ~>
|
41
|
+
- - "~>"
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: '10.1'
|
44
44
|
- !ruby/object:Gem::Dependency
|
45
45
|
name: rspec
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
47
47
|
requirements:
|
48
|
-
- - ~>
|
48
|
+
- - "~>"
|
49
49
|
- !ruby/object:Gem::Version
|
50
|
-
version: '2
|
50
|
+
version: '3.2'
|
51
51
|
type: :development
|
52
52
|
prerelease: false
|
53
53
|
version_requirements: !ruby/object:Gem::Requirement
|
54
54
|
requirements:
|
55
|
-
- - ~>
|
55
|
+
- - "~>"
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version: '2
|
57
|
+
version: '3.2'
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: json
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
|
-
- -
|
62
|
+
- - ">"
|
63
63
|
- !ruby/object:Gem::Version
|
64
64
|
version: '0'
|
65
65
|
type: :runtime
|
66
66
|
prerelease: false
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
68
68
|
requirements:
|
69
|
-
- -
|
69
|
+
- - ">"
|
70
70
|
- !ruby/object:Gem::Version
|
71
71
|
version: '0'
|
72
72
|
description: Pre-parser for JSON that removes C/C++ style comments and whitespace
|
@@ -77,14 +77,16 @@ executables: []
|
|
77
77
|
extensions: []
|
78
78
|
extra_rdoc_files: []
|
79
79
|
files:
|
80
|
-
- .gitignore
|
80
|
+
- ".gitignore"
|
81
81
|
- Gemfile
|
82
82
|
- LICENSE.txt
|
83
83
|
- README.md
|
84
84
|
- Rakefile
|
85
85
|
- json-minify.gemspec
|
86
86
|
- lib/json/minify.rb
|
87
|
+
- lib/json/minify/repairer.rb
|
87
88
|
- lib/json/minify/version.rb
|
89
|
+
- spec/minify_repairer_spec.rb
|
88
90
|
- spec/minify_spec.rb
|
89
91
|
homepage: http://github.com/geoffyoungs/json-minify-rb
|
90
92
|
licenses:
|
@@ -96,19 +98,20 @@ require_paths:
|
|
96
98
|
- lib
|
97
99
|
required_ruby_version: !ruby/object:Gem::Requirement
|
98
100
|
requirements:
|
99
|
-
- -
|
101
|
+
- - ">="
|
100
102
|
- !ruby/object:Gem::Version
|
101
103
|
version: '0'
|
102
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
105
|
requirements:
|
104
|
-
- -
|
106
|
+
- - ">="
|
105
107
|
- !ruby/object:Gem::Version
|
106
108
|
version: '0'
|
107
109
|
requirements: []
|
108
110
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.2.
|
111
|
+
rubygems_version: 2.2.5
|
110
112
|
signing_key:
|
111
113
|
specification_version: 4
|
112
114
|
summary: JSON.minify implementation
|
113
115
|
test_files:
|
116
|
+
- spec/minify_repairer_spec.rb
|
114
117
|
- spec/minify_spec.rb
|