tidy_json 0.2.2 → 0.5.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.
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ if ENV['COVERAGE']
4
+ begin
5
+ require 'simplecov'
6
+ SimpleCov.start
7
+ SimpleCov.command_name 'Unit Tests'
8
+
9
+ if ENV['CI']
10
+ require 'simplecov-cobertura'
11
+ SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
12
+ end
13
+ rescue LoadError
14
+ warn "Can't locate coverage drivers! Try running: `bundle install` first."
15
+ end
16
+ end
@@ -1,37 +1,59 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'codecov_runner'
3
4
  require 'test/unit'
4
5
  require 'tidy_json'
5
6
 
6
7
  ##
7
8
  # Tests.
8
9
  #
10
+ class Nested
11
+ attr_accessor :a, :b, :c, :d, :e
12
+
13
+ def initialize
14
+ @a = [[], [[5, 6, 7]], [1, 2, { 'three': 3, 'four': [5, 6] }, [4]], { 'inner': 1 }]
15
+ @b = { 'a': [5], 'b': [1, 2, 3, [4]], 'c': [5], 'd': { 'inner': 1 }, 'e': [6] }
16
+ @c = [[1, 2, 3, [4]], { 'inner': 1 }, {}]
17
+ @d = [{}, [], [1, 2, 3, [4]], { 'inner': 1 }, []]
18
+ @e = [[1, 2, 3, [4]], { 'inner': 1 }, {}]
19
+ end
20
+ end
21
+
9
22
  class JsonableObject
10
- attr_reader(:h, :a)
23
+ attr_reader :a, :b, :c, :d, :e, :f, :h
11
24
 
12
25
  def initialize
13
26
  @h = { one: 'uno', two: 'dos', three: %w[eine zwei drei], cuatro: ['I', 'II', 'III', ['i.', 'ii.', 'iii.', 'iv.']] }
14
27
  @a = ['k', 'l', %w[M N O P], 'q', 'r', 's', [10, 456, ['<abbr title="Reel 2, Dialog Track 2">R2D2</abbr>', 'R', 2, 'D', ['two']]], 'u', 'v', 'x', 'y', %w[Z AB]]
28
+ @b = [{ 'uno': Nested.new }, [Nested.new, [Nested.new, Nested.new], [Nested.new]]]
29
+ @c = [[Nested.new, [Nested.new], [Nested.new]]]
30
+ @d = []
31
+ @f = {}
15
32
  end
16
33
  end
17
34
 
18
35
  class TidyJsonTest < Test::Unit::TestCase
19
- @@t = JsonableObject.new
20
- @@t2 = JsonableObject.new
21
- @@t3 = JsonableObject.new
22
- @@t.h[:cinque] = { 'ichi' => "\u{4e00}", 'ni' => "\u{4e8c}", 'san' => "\u{4e09}", 'yon' => "\u{56db}" }
23
- @@t.h[:sei] = @@t2
24
- @@t2.h[:five] = @@t3
25
- @@t.a.unshift([@@t2, 13, 14, 15, 5.6])
36
+ def setup
37
+ @t = JsonableObject.new
38
+ t2 = JsonableObject.new
39
+ t3 = JsonableObject.new
40
+
41
+ 30.times { |_| t3.d << JsonableObject.new }
42
+ t2.h[:five] = t3
43
+
44
+ @t.h[:cinque] = { 'ichi' => "\u{4e00}", 'ni' => "\u{4e8c}", 'san' => "\u{4e09}", 'yon' => "\u{56db}" }
45
+ @t.h[:sei] = t2
46
+ @t.a.unshift([t2, 13, 14, 15, 5.6])
47
+ end
26
48
 
27
49
  def test_version_number
28
50
  refute_nil ::TidyJson::VERSION
29
51
  end
30
52
 
31
53
  def test_tidy_static
32
- assert_equal("{\n \"a\": \"one\", \n \"A\": \"ONE\", \n \"b\": null\n}\n",
54
+ assert_equal("{\n \"a\": \"one\",\n \"A\": \"ONE\",\n \"b\": null\n}\n",
33
55
  TidyJson.tidy(a: 'one', A: 'ONE', b: nil))
34
- assert_equal(4, TidyJson.tidy({}).length)
56
+ assert_equal(3, TidyJson.tidy({}).length)
35
57
  end
36
58
 
37
59
  def test_sort_keys_static
@@ -55,35 +77,39 @@ class TidyJsonTest < Test::Unit::TestCase
55
77
  def test_sort_keys_instance
56
78
  flat_hash_array = [{ c: 3 }, { a: 1 }, { b: 2 }]
57
79
  nested_hash_array = [{ c: 3, d: { i: '34', ii: '35', f: 56, a: 9 } }, { a: 1 }, { b: 2 }]
58
- assert_equal("[\n {\n \"a\": 1\n }, \n {\n \"b\": 2\n }, \n {\n \"c\": 3\n }\n]\n",
80
+ assert_equal("[\n {\n \"a\": 1\n },\n {\n \"b\": 2\n },\n {\n \"c\": 3\n }\n]\n",
59
81
  flat_hash_array.to_tidy_json(sort: true))
60
- assert_equal("[\n {\n \"a\": 1\n }, \n {\n \"b\": 2\n }, \n {\n \"c\": 3,\n \"d\": {\n \"a\": 9,\n \"f\": 56,\n \"i\": \"34\",\n \"ii\": \"35\"\n }\n }\n]\n",
82
+ assert_equal("[\n {\n \"a\": 1\n },\n {\n \"b\": 2\n },\n {\n \"c\": 3,\n \"d\": {\n \"a\": 9,\n \"f\": 56,\n \"i\": \"34\",\n \"ii\": \"35\"\n }\n }\n]\n",
61
83
  nested_hash_array.to_tidy_json(indent: 8, sort: true))
62
- assert_equal("{\n \"a\": \"one\", \n \"b\": \"two\", \n \"c\": 3\n}\n",
84
+ assert_equal("{\n \"a\": \"one\",\n \"b\": \"two\",\n \"c\": 3\n}\n",
63
85
  { 'b': 'two', 'c': 3, 'a': 'one' }.to_tidy_json(indent: 6, sort: true))
64
- assert_equal("[\n]\n", [].to_tidy_json(sort: true))
65
- assert_equal("{\n}\n", {}.to_tidy_json(sort: true))
66
- assert_equal("[\n 3, \n 2, \n 1\n]\n",
86
+ assert_equal("[]\n", [].to_tidy_json(sort: true))
87
+ assert_equal("{}\n", {}.to_tidy_json(sort: true))
88
+ assert_equal("[\n 3,\n 2,\n 1\n]\n",
67
89
  [3, 2, 1].to_tidy_json(indent: 8, sort: true))
68
- assert_equal("[\n {\n \"b\": \"two\"\n }, \n \"one\"\n]\n",
90
+ assert_equal("[\n {\n \"b\": \"two\"\n },\n \"one\"\n]\n",
69
91
  [{ 'b': 'two' }, 'one'].to_tidy_json(indent: 4, sort: true))
70
92
  end
71
93
 
72
94
  def test_tidy_instance
73
- assert_equal({}.to_tidy_json, "{\n}\n")
74
- assert_equal([].to_tidy_json, "[\n]\n")
75
- assert_equal(Object.new.to_tidy_json, '')
76
- assert_equal(JsonableObject.new.to_tidy_json.length, 650)
95
+ assert_equal({}.to_tidy_json, "{}\n")
96
+ assert_equal([].to_tidy_json, "[]\n")
97
+ assert_equal(String.new.to_tidy_json, "\"\"\n")
98
+ assert_equal(JsonableObject.new.to_tidy_json.length, 13_410)
77
99
  end
78
100
 
79
101
  def test_stringify_instance
80
- assert_equal(@@t.stringify, "{\"class\":\"JsonableObject\",\"h\":{\"one\":\"uno\",\"two\":\"dos\",\"three\":[\"eine\",\"zwei\",\"drei\"],\"cuatro\":[\"I\",\"II\",\"III\",[\"i.\",\"ii.\",\"iii.\",\"iv.\"]],\"cinque\":{\"ichi\":\"\u{4e00}\",\"ni\":\"\u{4e8c}\",\"san\":\"\u{4e09}\",\"yon\":\"\u{56db}\"},\"sei\":{\"class\":\"JsonableObject\",\"h\":{\"one\":\"uno\",\"two\":\"dos\",\"three\":[\"eine\",\"zwei\",\"drei\"],\"cuatro\":[\"I\",\"II\",\"III\",[\"i.\",\"ii.\",\"iii.\",\"iv.\"]],\"five\":{\"class\":\"JsonableObject\",\"h\":{\"one\":\"uno\",\"two\":\"dos\",\"three\":[\"eine\",\"zwei\",\"drei\"],\"cuatro\":[\"I\",\"II\",\"III\",[\"i.\",\"ii.\",\"iii.\",\"iv.\"]]},\"a\":[\"k\",\"l\",[\"M\",\"N\",\"O\",\"P\"],\"q\",\"r\",\"s\",[10,456,[\"<abbr title=\\\"Reel 2, Dialog Track 2\\\">R2D2</abbr>\",\"R\",2,\"D\",[\"two\"]]],\"u\",\"v\",\"x\",\"y\",[\"Z\",\"AB\"]]}},\"a\":[\"k\",\"l\",[\"M\",\"N\",\"O\",\"P\"],\"q\",\"r\",\"s\",[10,456,[\"<abbr title=\\\"Reel 2, Dialog Track 2\\\">R2D2</abbr>\",\"R\",2,\"D\",[\"two\"]]],\"u\",\"v\",\"x\",\"y\",[\"Z\",\"AB\"]]}},\"a\":[{\"class\":\"JsonableObject\",\"h\":{\"one\":\"uno\",\"two\":\"dos\",\"three\":[\"eine\",\"zwei\",\"drei\"],\"cuatro\":[\"I\",\"II\",\"III\",[\"i.\",\"ii.\",\"iii.\",\"iv.\"]],\"five\":{\"class\":\"JsonableObject\",\"h\":{\"one\":\"uno\",\"two\":\"dos\",\"three\":[\"eine\",\"zwei\",\"drei\"],\"cuatro\":[\"I\",\"II\",\"III\",[\"i.\",\"ii.\",\"iii.\",\"iv.\"]]},\"a\":[\"k\",\"l\",[\"M\",\"N\",\"O\",\"P\"],\"q\",\"r\",\"s\",[10,456,[\"<abbr title=\\\"Reel 2, Dialog Track 2\\\">R2D2</abbr>\",\"R\",2,\"D\",[\"two\"]]],\"u\",\"v\",\"x\",\"y\",[\"Z\",\"AB\"]]}},\"a\":[\"k\",\"l\",[\"M\",\"N\",\"O\",\"P\"],\"q\",\"r\",\"s\",[10,456,[\"<abbr title=\\\"Reel 2, Dialog Track 2\\\">R2D2</abbr>\",\"R\",2,\"D\",[\"two\"]]],\"u\",\"v\",\"x\",\"y\",[\"Z\",\"AB\"]]},[13,14,15,5.6],\"k\",\"l\",[\"M\",\"N\",\"O\",\"P\"],\"q\",\"r\",\"s\",[10,456,[\"<abbr title=\\\"Reel 2, Dialog Track 2\\\">R2D2</abbr>\",\"R\",2,\"D\",[\"two\"]]],\"u\",\"v\",\"x\",\"y\",[\"Z\",\"AB\"]]}")
102
+ File.open("#{__dir__}/JsonableObject.json", 'r') do |json|
103
+ assert_equal(@t.stringify, json.read.strip)
104
+ end
105
+ rescue Errno::ENOENT, Errno::EACCES, IOError => e
106
+ flunk "#{__FILE__}.#{__LINE__}: #{e.message}"
81
107
  end
82
108
 
83
109
  def test_writers
84
110
  json_array = []
85
111
  assert_nothing_thrown '#stringify returns valid JSON' do
86
- 3.times { |_| json_array << JSON.parse(@@t.stringify) }
112
+ 3.times { |_| json_array << JSON.parse(@t.stringify) }
87
113
  end
88
114
 
89
115
  output = json_array.write_json
@@ -93,24 +119,28 @@ class TidyJsonTest < Test::Unit::TestCase
93
119
  end
94
120
 
95
121
  pretty_output = \
96
- json_array.write_json('prettified', tidy: true, sort: true, indent: 8)
122
+ json_array.write_json('prettified', tidy: true, sort: true, indent: 4)
123
+
97
124
  assert(File.exist?(pretty_output))
125
+
98
126
  assert_nothing_thrown 'Formatted JSON should be valid' do
99
127
  File.open(pretty_output, 'r') { |f| JSON.parse(f.read) }
100
128
  end
129
+
130
+ assert_nil json_array.write_json('/invalid/file/name/')
101
131
  end
102
132
 
103
133
  def test_indent_bounds_checking
104
- assert_equal("{\n \"a\": \"one\", \n \"b\": \"two\", \n \"c\": 3\n}\n",
134
+ assert_equal("{\n \"a\": \"one\",\n \"b\": \"two\",\n \"c\": 3\n}\n",
105
135
  { 'b': 'two', 'c': 3, 'a': 'one' }.to_tidy_json(indent: 5, sort: true),
106
136
  'odd values should fall back to default of 2')
107
- assert_equal([].to_tidy_json(indent: '16'), "[\n]\n",
137
+ assert_equal([].to_tidy_json(indent: '16'), "[]\n",
108
138
  'values > 12 should fall back to default of 2')
109
- assert_equal('Object'.to_tidy_json(indent: []), '')
110
- assert_equal(0.to_tidy_json(indent: -89), '')
111
- assert_equal(3.1425.to_tidy_json(indent: 3.1425), '')
112
- assert_equal(''.to_tidy_json(indent: +0), '')
113
- assert_equal([].to_tidy_json(indent: -8.00009), "[\n]\n")
139
+ assert_equal('Object'.to_tidy_json(indent: []), "\"Object\"\n")
140
+ assert_equal(0.to_tidy_json(indent: -89), "0\n")
141
+ assert_equal(3.1425.to_tidy_json(indent: 3.1425), "3.1425\n")
142
+ assert_equal(''.to_tidy_json(indent: +0), "\"\"\n")
143
+ assert_equal([].to_tidy_json(indent: -8.00009), "[]\n")
114
144
  assert_nothing_thrown '#stringify should return valid JSON even when ' \
115
145
  'format options are invalid' do
116
146
  assert_equal(JSON.parse(Object.new.stringify).to_tidy_json(indent: nil),
data/tidy_json.gemspec CHANGED
@@ -12,16 +12,20 @@ Gem::Specification.new do |spec|
12
12
  spec.authors = ['Robert Di Pardo']
13
13
  spec.email = 'dipardo.r@gmail.com'
14
14
  spec.homepage = 'https://github.com/rdipardo/tidy_json'
15
- spec.metadata = { 'documentation_uri' => 'https://rubydoc.org/github/rdipardo/tidy_json/master' }
16
15
  spec.license = 'MIT'
16
+ spec.metadata = {
17
+ 'documentation_uri' => 'https://rubydoc.org/github/rdipardo/tidy_json',
18
+ 'bug_tracker_uri' => 'https://github.com/rdipardo/tidy_json/issues'
19
+ }
17
20
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
- ['.yardopts'].concat(`git ls-files -z`.split("\x0").reject { |f| f.match(/^(\.[\w+\.]+|test|spec|features)/) })
21
+ ['.yardopts'].concat(`git ls-files -z`.split("\x0").reject { |f| f.match(/^(\.[\w+\.]+|test|spec|features|codecov)/) })
19
22
  end
20
23
  spec.test_files = Dir['test/*']
21
24
  spec.require_paths = ['lib']
25
+ spec.executables = ['jtidy']
22
26
  spec.required_ruby_version = Gem::Requirement.new('>= 2.3')
23
- spec.add_runtime_dependency 'json', '~> 2.2'
24
- spec.add_development_dependency 'test-unit', '~> 3.3'
27
+ spec.add_runtime_dependency 'json', '~> 2.5'
28
+ spec.add_development_dependency 'test-unit', '~> 3.4'
25
29
  spec.add_development_dependency 'yard', '~> 0.9'
26
30
  spec.rdoc_options = ['-x test/*']
27
31
  spec.post_install_message = TidyJson::DEDICATION
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tidy_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Di Pardo
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-21 00:00:00.000000000 Z
11
+ date: 2021-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.2'
19
+ version: '2.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.2'
26
+ version: '2.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: test-unit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.3'
33
+ version: '3.4'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.3'
40
+ version: '3.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: yard
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -54,7 +54,8 @@ dependencies:
54
54
  version: '0.9'
55
55
  description: A mixin providing (recursive) JSON serialization and pretty printing.
56
56
  email: dipardo.r@gmail.com
57
- executables: []
57
+ executables:
58
+ - jtidy
58
59
  extensions: []
59
60
  extra_rdoc_files: []
60
61
  files:
@@ -63,16 +64,23 @@ files:
63
64
  - LICENSE
64
65
  - README.md
65
66
  - Rakefile
67
+ - bin/jtidy
68
+ - bin/jtidy_info.rb
66
69
  - lib/tidy_json.rb
67
70
  - lib/tidy_json/dedication.rb
71
+ - lib/tidy_json/formatter.rb
72
+ - lib/tidy_json/serializer.rb
68
73
  - lib/tidy_json/version.rb
74
+ - test/JsonableObject.json
75
+ - test/codecov_runner.rb
69
76
  - test/test_tidy_json.rb
70
77
  - tidy_json.gemspec
71
78
  homepage: https://github.com/rdipardo/tidy_json
72
79
  licenses:
73
80
  - MIT
74
81
  metadata:
75
- documentation_uri: https://rubydoc.org/github/rdipardo/tidy_json/master
82
+ documentation_uri: https://rubydoc.org/github/rdipardo/tidy_json
83
+ bug_tracker_uri: https://github.com/rdipardo/tidy_json/issues
76
84
  post_install_message: |2+
77
85
 
78
86
  ....................................................
@@ -82,9 +90,14 @@ post_install_message: |2+
82
90
  ................. MICHAEL DI PARDO .................
83
91
  ....................................................
84
92
  ............ Please consider supporting ............
85
- ............. the MS Society of Canada .............
93
+ ........... multiple sclerosis research: ...........
86
94
  ....................................................
95
+ ....................... (US) .......................
96
+ ..... https://www.nationalmssociety.org/Donate .....
97
+ ..................... (Canada) .....................
87
98
  ........ https://mssociety.ca/get-involved .........
99
+ ....................... (UK) .......................
100
+ .... https://www.mssociety.org.uk/get-involved .....
88
101
  ....................................................
89
102
 
90
103
  rdoc_options:
@@ -102,9 +115,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
115
  - !ruby/object:Gem::Version
103
116
  version: '0'
104
117
  requirements: []
105
- rubygems_version: 3.0.8
106
- signing_key:
118
+ rubygems_version: 3.2.22
119
+ signing_key:
107
120
  specification_version: 4
108
121
  summary: Serialize any Ruby object as readable JSON
109
122
  test_files:
123
+ - test/JsonableObject.json
124
+ - test/codecov_runner.rb
110
125
  - test/test_tidy_json.rb
126
+ ...