neatjson 0.5 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0459381e78a14d8183c5262ac82b70bc1337ffe
4
- data.tar.gz: bf9ee16f7b298fe1c9d97373444c39ba5f31f7b5
3
+ metadata.gz: bea172fb8129d16c9334bd5ffdce64be0841fea2
4
+ data.tar.gz: 09cb444f5bc31b69a08a89e82a45484865c3d5ab
5
5
  SHA512:
6
- metadata.gz: 85c571efbf5b496201b0f9147e0e830346d3441c0aca0c2118cff978b48f66ec9e6f0ea5b11d4aa14ae43720bfb7863d9b5d39f9a99d279cb2099ce879448731
7
- data.tar.gz: 87debda657ab8272bd8039f452c83c4f6083c491258918935e7aee0497fbbcfe8468070b8e32e6219c1362d4c594c95a33ecac797c3d8a634e63ea51fb3dabf8
6
+ metadata.gz: 85b9b72bd66a09a29aa5f299d6febce537d103cef6ca023552004730a227f6db65ef05fa5c3a94d81d827f8bb31b4b242166fd4f2f5ef892fb185527bd45609b
7
+ data.tar.gz: 6fa5bce4bdffda217798aa340b0c273e0abb9d6d628049e1351eac01d52cc0aa77243ec59febaf7e9618e82563d3c06872b9d3dd1392ce6b48d92b197183c855
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # NeatJSON
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/neatjson.svg)](http://badge.fury.io/rb/neatjson)
4
+ [![Gem Downloads](http://ruby-gem-downloads-badge.herokuapp.com/neatjson?type=total&color=brightgreen)](https://rubygems.org/gems/neatjson)
4
5
 
5
6
  Pretty-print your JSON in Ruby with more power than is provided by `JSON.pretty_generate`. In particular, like Ruby's `pp` (pretty print), NeatJSON will keep objects on one line if they fit, but break them over multiple lines if needed.
6
7
 
@@ -133,8 +134,12 @@ You may pass any of the following option symbols to `neat_generate`:
133
134
  * `:before_comma` — Number of spaces to put before commas (for both arrays and objects). Default: `0`
134
135
  * `:after_comma` — Number of spaces to put after commas (for both arrays and objects). Default: `0`
135
136
  * `:around_comma` — Shorthand to set both `:before_comma` and `:after_comma`. Default: `0`
136
- * `:before_colon` — Number of spaces to put before colons. Default: `0`
137
- * `:after_colon` — Number of spaces to put after colons. Default: `0`
137
+ * `:before_colon_1` — Number of spaces before a colon when the object is on one line. Default: `0`
138
+ * `:after_colon_1` — Number of spaces after a colon when the object is on one line. Default: `0`
139
+ * `:before_colon_n` — Number of spaces before a colon when the object is on multiple lines. Default: `0`
140
+ * `:after_colon_n` — Number of spaces after a colon when the object is on multiple lines. Default: `0`
141
+ * `:before_colon` — Shorthand to set both `:before_colon_1` and `:before_colon_n`. Default: `0`
142
+ * `:after_colon` — Shorthand to set both `:after_colon_1` and `:after_colon_n`. Default: `0`
138
143
  * `:around_colon` — Shorthand to set both `:before_colon` and `:after_colon`. Default: `0`
139
144
 
140
145
 
@@ -150,13 +155,15 @@ For other communication you can [email the author directly](mailto:!@phrogz.net?
150
155
  ## TODO (aka Known Limitations)
151
156
 
152
157
  * Figure out the best way to play with custom objects that use `to_json` for their representation.
153
- * Option for `around_colon` to only apply to multi-line objects.
154
158
  * Detect circular references.
155
159
  * Possibly allow illegal JSON values like `NaN` or `Infinity`.
156
160
  * Possibly allow "JSON5" output (legal identifiers unquoted, etc.)
157
161
 
158
162
  ## HISTORY
159
163
 
164
+ * **v0.6** - April 26th, 2015
165
+ * Added `before_colon_1` and `before_colon_n` to distinguish between single-line and multi-line objects.
166
+
160
167
  * **v0.5** - April 19th, 2015
161
168
  * Do not format integers (or floats that equal their integer) using `decimals` option.
162
169
  * Make `neatJSON()` JavaScript available to Node.js as well as web browsers.
data/lib/neatjson.rb CHANGED
@@ -21,6 +21,12 @@ module JSON
21
21
  # @option opts [Integer] :around_colon (0) Number of spaces to put before/after colons (for objects).
22
22
  # @option opts [Integer] :before_colon (0) Number of spaces to put before colons (for objects).
23
23
  # @option opts [Integer] :after_colon (0) Number of spaces to put after colons (for objects).
24
+ # @option opts [Integer] :around_colon_1 (0) Number of spaces to put before/after colons for single-line objects.
25
+ # @option opts [Integer] :before_colon_1 (0) Number of spaces to put before colons for single-line objects.
26
+ # @option opts [Integer] :after_colon_1 (0) Number of spaces to put after colons for single-line objects.
27
+ # @option opts [Integer] :around_colon_n (0) Number of spaces to put before/after colons for multi-line objects.
28
+ # @option opts [Integer] :before_colon_n (0) Number of spaces to put before colons for multi-line objects.
29
+ # @option opts [Integer] :after_colon_n (0) Number of spaces to put after colons for multi-line objects.
24
30
  # @return [String] the JSON representation of the object.
25
31
  def self.neat_generate(object,opts={})
26
32
  opts[:wrap] = 80 unless opts.key?(:wrap)
@@ -32,12 +38,17 @@ module JSON
32
38
  opts[:before_comma] ||= opts[:around_comma] || 0
33
39
  opts[:before_colon] ||= opts[:around_colon] || 0
34
40
  opts[:after_colon] ||= opts[:around_colon] || 0
41
+ opts[:before_colon_1] ||= opts[:around_colon_1] || opts[:before_colon] || 0
42
+ opts[:after_colon_1] ||= opts[:around_colon_1] || opts[:after_colon] || 0
43
+ opts[:before_colon_n] ||= opts[:around_colon_n] || opts[:before_colon] || 0
44
+ opts[:after_colon_n] ||= opts[:around_colon_n] || opts[:after_colon] || 0
35
45
  raise ":indent option must only be whitespace" if opts[:indent]=~/\S/
36
46
 
37
47
  apad = " " * opts[:array_padding]
38
48
  opad = " " * opts[:object_padding]
39
49
  comma = "#{' '*opts[:before_comma]},#{' '*opts[:after_comma]}"
40
- colon = "#{' '*opts[:before_colon]}:#{' '*opts[:after_colon]}"
50
+ colon1= "#{' '*opts[:before_colon_1]}:#{' '*opts[:after_colon_1]}"
51
+ colonn= "#{' '*opts[:before_colon_n]}:#{' '*opts[:after_colon_n]}"
41
52
 
42
53
  build = ->(o,indent) do
43
54
  case o
@@ -73,7 +84,7 @@ module JSON
73
84
  when Hash
74
85
  keyvals = o.map{ |k,v| [ k.to_s.inspect, build[v,''] ] }
75
86
  keyvals = keyvals.sort_by(&:first) if opts[:sorted]
76
- keyvals = keyvals.map{ |kv| kv.join(colon) }.join(comma)
87
+ keyvals = keyvals.map{ |kv| kv.join(colon1) }.join(comma)
77
88
  one_line = "#{indent}{#{opad}#{keyvals}#{opad}}"
78
89
  if !opts[:wrap] || (one_line.length <= opts[:wrap])
79
90
  one_line
@@ -87,10 +98,10 @@ module JSON
87
98
  keyvals.each{ |k,v| k.replace( "%-#{longest}s" % k ) }
88
99
  end
89
100
  keyvals.map! do |k,v|
90
- indent2 = " "*"#{k}#{colon}".length
91
- one_line = "#{k}#{colon}#{build[v,'']}"
101
+ indent2 = " "*"#{k}#{colonn}".length
102
+ one_line = "#{k}#{colonn}#{build[v,'']}"
92
103
  if opts[:wrap] && (one_line.length > opts[:wrap]) && (v.is_a?(Array) || v.is_a?(Hash))
93
- "#{k}#{colon}#{build[v,indent2].lstrip}"
104
+ "#{k}#{colonn}#{build[v,indent2].lstrip}"
94
105
  else
95
106
  one_line
96
107
  end
@@ -105,9 +116,9 @@ module JSON
105
116
  end
106
117
  indent2 = "#{indent}#{opts[:indent]}"
107
118
  keyvals.map! do |k,v|
108
- one_line = "#{k}#{colon}#{build[v,'']}"
119
+ one_line = "#{k}#{colonn}#{build[v,'']}"
109
120
  if opts[:wrap] && (one_line.length > opts[:wrap]) && (v.is_a?(Array) || v.is_a?(Hash))
110
- "#{k}#{colon}#{build[v,indent2].lstrip}"
121
+ "#{k}#{colonn}#{build[v,indent2].lstrip}"
111
122
  else
112
123
  one_line
113
124
  end
data/neatjson.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
  require 'date'
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "neatjson"
5
- s.version = "0.5"
5
+ s.version = "0.6"
6
6
  s.date = Date.today.iso8601
7
7
  s.authors = ["Gavin Kistner"]
8
8
  s.email = "gavin@phrogz.net"
@@ -1,4 +1,6 @@
1
1
  var neatJSON = require('../javascript/neatjson.js').neatJSON;
2
+ var startTime = new Date;
3
+ var count=0, pass=0;
2
4
  require('./tests.js').tests.forEach(function(valTest){
3
5
  var value = valTest.value;
4
6
  valTest.tests.forEach(function(test){
@@ -12,12 +14,17 @@ require('./tests.js').tests.forEach(function(valTest){
12
14
  var json = neatJSON(value);
13
15
  }
14
16
  var success = (test.json.constructor==RegExp) ? test.json.test(json) : json==test.json;
15
- if (!success){
17
+ if (success) pass+=1;
18
+ else{
16
19
  console.log(mesg+")");
17
20
  console.log('EXPECTED');
18
21
  console.log(test.json);
19
22
  console.log('ACTUAL');
20
23
  console.log(json,"\n");
21
24
  }
25
+ count+=1;
22
26
  });
23
27
  });
28
+ var elapsed = (new Date)-startTime;
29
+ console.log(pass+"/"+count+" test"+(count==1 ? '' : 's')+" passed in "+elapsed.toFixed(2)+"ms ("+(count/elapsed*1000).toFixed(0)+" tests per second)");
30
+
@@ -1,15 +1,22 @@
1
1
  require '../lib/neatjson'
2
2
  require './tests'
3
3
 
4
+ start = Time.now
5
+ pass = 0
6
+ count = 0
4
7
  TESTS.each do |value_tests|
5
8
  val, tests = value_tests[:value], value_tests[:tests]
6
9
  tests.each do |test|
7
10
  begin
11
+ count += 1
8
12
  json = test[:opts] ? JSON.neat_generate(val,test[:opts].dup) : JSON.neat_generate(val)
9
13
  mesg = test[:opts] ? "JSON.neat_generate(#{val.inspect},#{test[:opts].inspect})" : "JSON.neat_generate(#{val.inspect})"
10
14
  raise "#{mesg}\nEXPECTED:\n#{test[:json]}\nACTUAL:\n#{json}\n\n" unless test[:json]===json
15
+ pass += 1
11
16
  rescue StandardError => e
12
17
  puts e
13
18
  end
14
19
  end
15
- end
20
+ end
21
+ elapsed = Time.now-start
22
+ puts "%d/%d test#{:s if count!=1} passed in %.2fms (%d tests per second)" % [pass, count, elapsed*1000, count/elapsed]
data/test/tests.js CHANGED
@@ -67,7 +67,16 @@ exports.tests = [
67
67
  { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,aroundColon:1,afterComma:1,objectPadding:1} },
68
68
  { json:'{"a" : 2, "b" : 1}', opts:{sorted:true,beforeColon:1,afterColon:1,afterComma:1,arrayPadding:1} },
69
69
  { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,aroundColon:2,afterComma:1,padding:2} },
70
- { json:'{ "a":2, "b":1 }', opts:{sorted:true,afterComma:1,padding:2} }
70
+ { json:'{ "a":2, "b":1 }', opts:{sorted:true,afterComma:1,padding:2} },
71
+ { json:'{"b": 1,"a": 2}', opts:{afterColon1:2} },
72
+ { json:'{"b" : 1,"a" : 2}', opts:{aroundColon1:2} },
73
+ { json:"{\n \"b\":1,\n \"a\":2\n}", opts:{wrap:true,aroundColon1:2} },
74
+ { json:"{\n \"b\": 1,\n \"a\": 2\n}", opts:{wrap:true,afterColon:1} },
75
+ { json:"{\n \"b\": 1,\n \"a\": 2\n}", opts:{wrap:true,afterColonN:1} },
76
+ { json:"{\"b\":1,\n \"a\":2}", opts:{wrap:true,short:true} },
77
+ { json:"{\"b\": 1,\n \"a\": 2}", opts:{wrap:true,short:true,afterColon:1} },
78
+ { json:"{\"b\": 1,\n \"a\": 2}", opts:{wrap:true,short:true,afterColonN:1} },
79
+ { json:"{\"b\":1,\n \"a\":2}", opts:{wrap:true,short:true,afterColon1:1} }
71
80
  ]},
72
81
 
73
82
  {value:{b:1,aaa:2,cc:3}, tests:[
data/test/tests.rb CHANGED
@@ -55,17 +55,26 @@ TESTS = [
55
55
 
56
56
  {value:{b:1,a:2}, tests:[
57
57
  { json:'{"b":1,"a":2}' },
58
- { json:'{"a":2,"b":1}', opts:{sorted:true} },
59
- { json:'{"a":2, "b":1}', opts:{sorted:true,after_comma:1} },
60
- { json:'{"a" :2,"b" :1}', opts:{sorted:true,before_colon:1} },
61
- { json:'{"a": 2,"b": 1}', opts:{sorted:true,after_colon:1} },
62
- { json:'{"a" : 2,"b" : 1}', opts:{sorted:true,before_colon:1,after_colon:1} },
63
- { json:'{"a" : 2, "b" : 1}', opts:{sorted:true,before_colon:1,after_colon:1,after_comma:1} },
64
- { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,before_colon:1,after_colon:1,after_comma:1,padding:1} },
65
- { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,around_colon:1,after_comma:1,object_padding:1} },
66
- { json:'{"a" : 2, "b" : 1}', opts:{sorted:true,before_colon:1,after_colon:1,after_comma:1,array_padding:1} },
67
- { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,around_colon:2,after_comma:1,padding:2} },
68
- { json:'{ "a":2, "b":1 }', opts:{sorted:true,after_comma:1,padding:2} }
58
+ { json:'{"a":2,"b":1}', opts:{sorted:true} },
59
+ { json:'{"a":2, "b":1}', opts:{sorted:true,after_comma:1} },
60
+ { json:'{"a" :2,"b" :1}', opts:{sorted:true,before_colon:1} },
61
+ { json:'{"a": 2,"b": 1}', opts:{sorted:true,after_colon:1} },
62
+ { json:'{"a" : 2,"b" : 1}', opts:{sorted:true,before_colon:1,after_colon:1} },
63
+ { json:'{"a" : 2, "b" : 1}', opts:{sorted:true,before_colon:1,after_colon:1,after_comma:1} },
64
+ { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,before_colon:1,after_colon:1,after_comma:1,padding:1} },
65
+ { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,around_colon:1,after_comma:1,object_padding:1} },
66
+ { json:'{"a" : 2, "b" : 1}', opts:{sorted:true,before_colon:1,after_colon:1,after_comma:1,array_padding:1} },
67
+ { json:'{ "a" : 2, "b" : 1 }', opts:{sorted:true,around_colon:2,after_comma:1,padding:2} },
68
+ { json:'{ "a":2, "b":1 }', opts:{sorted:true,after_comma:1,padding:2} },
69
+ { json:'{"b": 1,"a": 2}', opts:{after_colon_1:2} },
70
+ { json:'{"b" : 1,"a" : 2}', opts:{around_colon_1:2} },
71
+ { json:"{\n \"b\":1,\n \"a\":2\n}", opts:{wrap:true,around_colon_1:2} },
72
+ { json:"{\n \"b\": 1,\n \"a\": 2\n}", opts:{wrap:true,after_colon:1} },
73
+ { json:"{\n \"b\": 1,\n \"a\": 2\n}", opts:{wrap:true,after_colon_n:1} },
74
+ { json:"{\"b\":1,\n \"a\":2}", opts:{wrap:true,short:true} },
75
+ { json:"{\"b\": 1,\n \"a\": 2}", opts:{wrap:true,short:true,after_colon:1} },
76
+ { json:"{\"b\": 1,\n \"a\": 2}", opts:{wrap:true,short:true,after_colon_n:1} },
77
+ { json:"{\"b\":1,\n \"a\":2}", opts:{wrap:true,short:true,after_colon_1:1} },
69
78
  ]},
70
79
 
71
80
  {value:{b:1,aaa:2,cc:3}, tests:[
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neatjson
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.5'
4
+ version: '0.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gavin Kistner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-19 00:00:00.000000000 Z
11
+ date: 2015-04-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'Generate JSON strings from Ruby objects with flexible formatting options.
14
14
  Key features: keep arrays and objects on a single line when they fit; format floats