json-write-stream 1.2.0 → 2.0.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
- SHA1:
3
- metadata.gz: 7445d1cf85a82a9414433ebbdb06008eac6ac4e2
4
- data.tar.gz: a82b04356133b8b46c21906bab7d413aebeac855
2
+ SHA256:
3
+ metadata.gz: f3f098796321aaf71c015a22ee3b2c5fc7044ad0d67e5cbfd1c6c11ec8f47bec
4
+ data.tar.gz: 476ab378e44c73e9630642a91422224db73812414d2e9fb0bb504699a19c1d57
5
5
  SHA512:
6
- metadata.gz: 3818ce8ae032e722dbde636aaefa818975e91ab25a80e20045da648564051dffde7c12fb9e9291c9ecb2ad0bad48c2438665b672f2f773549f60339f6f4b163a
7
- data.tar.gz: 3632c1b6c3b499f20f46e3577f60221a15aec7a10e523a3d39b84b9d6513a9ff83deb6ee8bed07cc4d3dad5fedd7ef6f9b3a1cc255ce7a00f397ee2835cbc27a
6
+ metadata.gz: 5be8cc906b92bef8ab60e81c535af4937ceccb412271d3eedfbabf41f05fc0a4e4f12877c1bf65054981c19e36e4ee6d8c57471eb9d4574beeb4f51513c3b16b
7
+ data.tar.gz: acc20ad490eed07edaa2d93263d3ab5927570c410c4d8be7da5c71b05e60a051b25b52f2c056d376cca7dff64afd2ebaa1426c82879160b23d75bb65e1096d3c
data/Gemfile CHANGED
@@ -3,12 +3,10 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  group :development, :test do
6
- gem 'pry', '~> 0.9.0'
7
- gem 'pry-nav'
6
+ gem 'pry-byebug'
8
7
  gem 'rake'
9
8
  end
10
9
 
11
10
  group :test do
12
11
  gem 'rspec'
13
- gem 'rr'
14
12
  end
data/README.md CHANGED
@@ -102,6 +102,31 @@ writer.write_object
102
102
  writer.close
103
103
  ```
104
104
 
105
+ ### Options
106
+
107
+ JsonWriteStream supports generating "pretty" JSON, i.e. JSON formatted in a more human-readable way. Currently only the stateful writer supports pretty generation. Example:
108
+
109
+ ```ruby
110
+ stream = StringIO.new
111
+ writer = JsonWriteStream.from_stream(stream, pretty: true)
112
+ writer.write_object
113
+ writer.write_key_value('foo', 'bar')
114
+ writer.write_array('baz')
115
+ writer.write_element('goo')
116
+ writer.close
117
+ ```
118
+
119
+ Now `stream.string` will contain
120
+
121
+ ```json
122
+ {
123
+ "foo": "bar",
124
+ "baz": [
125
+ "goo"
126
+ ]
127
+ }
128
+ ```
129
+
105
130
  ## Requirements
106
131
 
107
132
  No external requirements.
@@ -6,21 +6,22 @@ require 'json-write-stream/stateful'
6
6
 
7
7
  class JsonWriteStream
8
8
  DEFAULT_ENCODING = Encoding::UTF_8
9
- DEFAULT_OPTIONS = { before: '', between: '' }.freeze
10
9
 
11
10
  class << self
12
- def from_stream(stream, encoding = DEFAULT_ENCODING)
11
+ def from_stream(stream, options = {})
12
+ encoding = options.fetch(:encoding, DEFAULT_ENCODING)
13
13
  stream.set_encoding(encoding)
14
14
 
15
15
  if block_given?
16
16
  yield writer = YieldingWriter.new(stream)
17
17
  writer.close
18
18
  else
19
- StatefulWriter.new(stream)
19
+ StatefulWriter.new(stream, options)
20
20
  end
21
21
  end
22
22
 
23
- def open(file, encoding = DEFAULT_ENCODING)
23
+ def open(file, options = {})
24
+ encoding = options.fetch(:encoding, DEFAULT_ENCODING)
24
25
  handle = File.open(file, 'w')
25
26
  handle.set_encoding(encoding)
26
27
 
@@ -28,7 +29,7 @@ class JsonWriteStream
28
29
  yield writer = YieldingWriter.new(handle)
29
30
  writer.close
30
31
  else
31
- StatefulWriter.new(handle)
32
+ StatefulWriter.new(handle, options)
32
33
  end
33
34
  end
34
35
  end
@@ -1,35 +1,47 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ require 'json'
4
+
3
5
  class JsonWriteStream
4
6
  class NotInObjectError < StandardError; end
5
7
  class NotInArrayError < StandardError; end
6
8
  class EndOfStreamError < StandardError; end
7
9
 
8
10
  class StatefulWriter
9
- attr_reader :stream, :index, :stack, :closed
10
- alias :closed? :closed
11
+ attr_reader :stream, :stack, :index, :closed, :options
12
+ alias_method :closed?, :closed
11
13
 
12
- def initialize(stream)
14
+ def initialize(stream, options = {})
13
15
  @stream = stream
14
- @index = 0
15
16
  @stack = []
16
17
  @closed = false
17
- after_initialize
18
- end
19
-
20
- def after_initialize
18
+ @options = options
19
+ @index = 0
21
20
  end
22
21
 
23
22
  def write_object(*args)
24
23
  check_eos
25
- current.write_object(*args) if current
26
- stack.push(StatefulObjectWriter.new(stream))
24
+ new_indent_level = 1
25
+
26
+ if current
27
+ current.write_object(*args)
28
+ new_indent_level = current.indent_level + 1
29
+ end
30
+
31
+ stack.push(StatefulObjectWriter.new(self, new_indent_level))
27
32
  end
28
33
 
29
34
  def write_array(*args)
30
35
  check_eos
31
- current.write_array(*args) if current
32
- stack.push(StatefulArrayWriter.new(stream))
36
+
37
+ new_indent_level = 1
38
+
39
+ if current
40
+ current.write_array(*args)
41
+ new_indent_level = current.indent_level + 1
42
+ end
43
+
44
+ stack.push(StatefulArrayWriter.new(self, new_indent_level))
33
45
  end
34
46
 
35
47
  def write_key_value(*args)
@@ -93,8 +105,20 @@ class JsonWriteStream
93
105
  (stack.size == 0 && index > 0) || closed?
94
106
  end
95
107
 
108
+ def pretty?
109
+ options.fetch(:pretty, false)
110
+ end
111
+
112
+ def indent_size
113
+ options.fetch(:indent_size, 2)
114
+ end
115
+
96
116
  protected
97
117
 
118
+ def increment
119
+ @index += 1
120
+ end
121
+
98
122
  def check_eos
99
123
  if eos?
100
124
  raise EndOfStreamError, 'end of stream.'
@@ -104,53 +128,99 @@ class JsonWriteStream
104
128
  def current
105
129
  stack.last
106
130
  end
131
+ end
132
+
133
+ class BaseWriter
134
+ attr_reader :writer, :indent_level, :index
135
+
136
+ def initialize(writer, indent_level)
137
+ @writer = writer
138
+ @indent_level = indent_level
139
+ @index = 0
140
+ after_initialize
141
+ end
142
+
143
+ def after_initialize
144
+ end
145
+
146
+ def stream
147
+ writer.stream
148
+ end
149
+
150
+ def increment
151
+ @index += 1
152
+ end
153
+
154
+ def indent(level = indent_level)
155
+ stream.write(' ' * indent_size * level) if pretty?
156
+ end
157
+
158
+ def indent_size
159
+ writer.indent_size
160
+ end
107
161
 
108
162
  def escape(str)
109
163
  JSON.generate([str])[1..-2]
110
164
  end
111
165
 
112
166
  def write_comma
113
- stream.write(',') if index > 0
167
+ if index > 0
168
+ stream.write(",")
169
+ write_newline
170
+ end
114
171
  end
115
172
 
116
- def increment
117
- @index += 1
173
+ def write_colon
174
+ stream.write(':')
175
+ stream.write(' ') if pretty?
176
+ end
177
+
178
+ def write_newline
179
+ stream.write("\n") if pretty?
180
+ end
181
+
182
+ def pretty?
183
+ writer.pretty?
118
184
  end
119
185
  end
120
186
 
121
- class StatefulObjectWriter < StatefulWriter
187
+ class StatefulObjectWriter < BaseWriter
122
188
  def after_initialize
123
- stream.write('{')
189
+ stream.write("{")
190
+ write_newline
124
191
  end
125
192
 
126
193
  # prep work (array is written afterwards)
127
194
  def write_array(key)
128
195
  write_comma
129
196
  increment
197
+ indent
130
198
  write_key(key)
131
- stream.write(':')
199
+ write_colon
132
200
  end
133
201
 
134
202
  # prep work (object is written afterwards)
135
203
  def write_object(key)
136
204
  write_comma
137
205
  increment
206
+ indent
138
207
  write_key(key)
139
- stream.write(':')
208
+ write_colon
140
209
  end
141
210
 
142
- def write_key_value(key, value, options = DEFAULT_OPTIONS)
211
+ def write_key_value(key, value)
143
212
  write_comma
144
- stream.write(options.fetch(:before, DEFAULT_OPTIONS[:before]))
145
213
  increment
214
+ indent
146
215
  write_key(key)
147
- stream.write(':')
148
- stream.write(options.fetch(:between, DEFAULT_OPTIONS[:between]))
216
+ write_colon
149
217
  stream.write(escape(value))
150
218
  end
151
219
 
152
220
  def close
153
- stream.write('}')
221
+ write_newline
222
+ indent(indent_level - 1)
223
+ stream.write("}")
154
224
  end
155
225
 
156
226
  def is_object?
@@ -173,15 +243,16 @@ class JsonWriteStream
173
243
  end
174
244
  end
175
245
 
176
- class StatefulArrayWriter < StatefulWriter
246
+ class StatefulArrayWriter < BaseWriter
177
247
  def after_initialize
178
- stream.write('[')
248
+ stream.write("[")
249
+ write_newline
179
250
  end
180
251
 
181
- def write_element(element, options = DEFAULT_OPTIONS)
252
+ def write_element(element)
182
253
  write_comma
183
- stream.write(options.fetch(:before, DEFAULT_OPTIONS[:before]))
184
254
  increment
255
+ indent
185
256
  stream.write(escape(element))
186
257
  end
187
258
 
@@ -189,16 +260,20 @@ class JsonWriteStream
189
260
  def write_array
190
261
  write_comma
191
262
  increment
263
+ indent
192
264
  end
193
265
 
194
266
  # prep work
195
267
  def write_object
196
268
  write_comma
197
269
  increment
270
+ indent
198
271
  end
199
272
 
200
273
  def close
201
- stream.write(']')
274
+ write_newline
275
+ indent(indent_level - 1)
276
+ stream.write("]")
202
277
  end
203
278
 
204
279
  def is_object?
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  class JsonWriteStream
4
- VERSION = '1.2.0'
4
+ VERSION = '2.0.0'
5
5
  end
@@ -2,11 +2,12 @@
2
2
 
3
3
  class JsonWriteStream
4
4
  class YieldingWriter
5
- attr_reader :stream, :index
5
+ attr_reader :stream, :index, :options
6
6
 
7
- def initialize(stream)
7
+ def initialize(stream, options = {})
8
8
  @stream = stream
9
9
  @index = 0
10
+ @options = options
10
11
  after_initialize
11
12
  end
12
13
 
@@ -60,33 +61,27 @@ class JsonWriteStream
60
61
  stream.write('{')
61
62
  end
62
63
 
63
- def write_array(key, options = DEFAULT_OPTIONS)
64
+ def write_array(key)
64
65
  write_comma
65
- stream.write(options.fetch(:before, DEFAULT_OPTIONS[:before]))
66
66
  increment
67
67
  write_key(key)
68
68
  stream.write(':')
69
- stream.write(options.fetch(:between, DEFAULT_OPTIONS[:between]))
70
69
  super(true)
71
70
  end
72
71
 
73
- def write_object(key, options = DEFAULT_OPTIONS)
72
+ def write_object(key)
74
73
  write_comma
75
- stream.write(options.fetch(:before, DEFAULT_OPTIONS[:before]))
76
74
  increment
77
75
  write_key(key)
78
76
  stream.write(':')
79
- stream.write(options.fetch(:between, DEFAULT_OPTIONS[:between]))
80
77
  super(true)
81
78
  end
82
79
 
83
- def write_key_value(key, value, options = DEFAULT_OPTIONS)
80
+ def write_key_value(key, value)
84
81
  write_comma
85
- stream.write(options.fetch(:before, DEFAULT_OPTIONS[:before]))
86
82
  increment
87
83
  write_key(key)
88
84
  stream.write(':')
89
- stream.write(options.fetch(:between, DEFAULT_OPTIONS[:between]))
90
85
  stream.write(escape(value))
91
86
  end
92
87
 
@@ -106,9 +101,8 @@ class JsonWriteStream
106
101
  stream.write('[')
107
102
  end
108
103
 
109
- def write_element(element, options = DEFAULT_OPTIONS)
104
+ def write_element(element)
110
105
  write_comma
111
- stream.write(options.fetch(:before, DEFAULT_OPTIONS[:before]))
112
106
  increment
113
107
  stream.write(escape(element))
114
108
  end
@@ -25,7 +25,7 @@ describe JsonWriteStream do
25
25
  end
26
26
 
27
27
  it 'supports specifying a different encoding' do
28
- stream_writer.from_stream(stream, Encoding::UTF_16BE) do |writer|
28
+ stream_writer.from_stream(stream, encoding: Encoding::UTF_16BE) do |writer|
29
29
  writer.write_object do |obj_writer|
30
30
  obj_writer.write_key_value('foo', 'bar')
31
31
  end
@@ -38,7 +38,7 @@ describe JsonWriteStream do
38
38
 
39
39
  describe '#open' do
40
40
  it 'opens a file and yields a yielding stream if given a block' do
41
- mock.proxy(File).open(tempfile, 'w')
41
+ expect(File).to receive(:open).with(tempfile, 'w').and_return(tempfile)
42
42
  stream_writer.open(tempfile) do |writer|
43
43
  expect(writer).to be_a(yielding_writer)
44
44
  expect(writer.stream.path).to eq(tempfile.path)
@@ -46,14 +46,14 @@ describe JsonWriteStream do
46
46
  end
47
47
 
48
48
  it 'opens a file and returns a stateful writer if not given a block' do
49
- mock.proxy(File).open(tempfile, 'w')
49
+ expect(File).to receive(:open).with(tempfile, 'w').and_return(tempfile)
50
50
  writer = stream_writer.open(tempfile)
51
51
  expect(writer).to be_a(stateful_writer)
52
52
  expect(writer.stream.path).to eq(tempfile.path)
53
53
  end
54
54
 
55
55
  it 'supports specifying a different encoding' do
56
- stream_writer.open(tempfile, Encoding::UTF_16BE) do |writer|
56
+ stream_writer.open(tempfile, encoding: Encoding::UTF_16BE) do |writer|
57
57
  writer.write_object do |obj_writer|
58
58
  obj_writer.write_key_value('foo', 'bar')
59
59
  end
@@ -1,30 +1,30 @@
1
1
  # encoding: UTF-8
2
2
 
3
- shared_examples 'a json stream' do
3
+ shared_examples 'a json stream' do |options = {}|
4
4
  it 'handles a simple array' do
5
- check_roundtrip(['abc'])
5
+ check_roundtrip(['abc'], options)
6
6
  end
7
7
 
8
8
  it 'handles a simple object' do
9
- check_roundtrip({ 'foo' => 'bar' })
9
+ check_roundtrip({ 'foo' => 'bar' }, options)
10
10
  end
11
11
 
12
12
  it 'handles one level of array nesting' do
13
- check_roundtrip([['def'],'abc'])
14
- check_roundtrip(['abc',['def']])
13
+ check_roundtrip([['def'],'abc'], options)
14
+ check_roundtrip(['abc',['def']], options)
15
15
  end
16
16
 
17
17
  it 'handles one level of object nesting' do
18
- check_roundtrip({ 'foo' => { 'bar' => 'baz' } })
18
+ check_roundtrip({ 'foo' => { 'bar' => 'baz' } }, options)
19
19
  end
20
20
 
21
21
  it 'handles one level of mixed nesting' do
22
- check_roundtrip({ 'foo' => ['bar', 'baz'] })
23
- check_roundtrip([{ 'foo' => 'bar' }])
22
+ check_roundtrip({ 'foo' => ['bar', 'baz'] }, options)
23
+ check_roundtrip([{ 'foo' => 'bar' }], options)
24
24
  end
25
25
 
26
26
  it 'handles multiple levels of mixed nesting' do
27
- check_roundtrip({'foo' => ['bar', { 'baz' => 'moo', 'gaz' => ['doo'] }, 'kal'], 'jim' => ['jill', ['john']] })
28
- check_roundtrip(['foo', { 'bar' => 'baz', 'moo' => ['gaz', ['jim', ['jill']], 'jam'] }])
27
+ check_roundtrip({'foo' => ['bar', { 'baz' => 'moo', 'gaz' => ['doo'] }, 'kal'], 'jim' => ['jill', ['john']] }, options)
28
+ check_roundtrip(['foo', { 'bar' => 'baz', 'moo' => ['gaz', ['jim', ['jill']], 'jam'] }], options)
29
29
  end
30
30
  end
@@ -3,19 +3,18 @@
3
3
  require 'rspec'
4
4
  require 'json-write-stream'
5
5
  require 'shared_examples'
6
- require 'pry-nav'
6
+ require 'pry-byebug'
7
7
 
8
8
  RSpec.configure do |config|
9
- config.mock_with :rr
10
9
  end
11
10
 
12
11
  class RoundtripChecker
13
12
  class << self
14
13
  include RSpec::Matchers
15
14
 
16
- def check_roundtrip(obj)
15
+ def check_roundtrip(obj, options = {})
17
16
  stream = StringIO.new
18
- writer = create_writer(stream)
17
+ writer = create_writer(stream, options)
19
18
  serialize(obj, writer)
20
19
  writer.close
21
20
  new_obj = JSON.parse(stream.string)
@@ -49,8 +48,8 @@ class YieldingRoundtripChecker < RoundtripChecker
49
48
  class << self
50
49
  protected
51
50
 
52
- def create_writer(stream)
53
- JsonWriteStream::YieldingWriter.new(stream)
51
+ def create_writer(stream, options = {})
52
+ JsonWriteStream::YieldingWriter.new(stream, options)
54
53
  end
55
54
 
56
55
  def serialize(obj, writer)
@@ -106,8 +105,8 @@ class StatefulRoundtripChecker < RoundtripChecker
106
105
  class << self
107
106
  protected
108
107
 
109
- def create_writer(stream)
110
- JsonWriteStream::StatefulWriter.new(stream)
108
+ def create_writer(stream, options = {})
109
+ JsonWriteStream::StatefulWriter.new(stream, options)
111
110
  end
112
111
 
113
112
  def serialize(obj, writer)
@@ -9,10 +9,11 @@ describe JsonWriteStream::YieldingWriter do
9
9
  end
10
10
  end
11
11
 
12
- let(:stream_writer) { JsonWriteStream::StatefulWriter.new(stream) }
12
+ let(:options) { {} }
13
+ let(:stream_writer) { JsonWriteStream::StatefulWriter.new(stream, options) }
13
14
 
14
- def check_roundtrip(obj)
15
- StatefulRoundtripChecker.check_roundtrip(obj)
15
+ def check_roundtrip(obj, options = {})
16
+ StatefulRoundtripChecker.check_roundtrip(obj, options)
16
17
  end
17
18
 
18
19
  def utf8(str)
@@ -21,20 +22,105 @@ describe JsonWriteStream::YieldingWriter do
21
22
 
22
23
  it_behaves_like 'a json stream'
23
24
 
24
- it 'respects the "before" option' do
25
- stream_writer.write_object
26
- stream_writer.write_key_value('foo', 'bar', before: "\n ")
27
- stream_writer.close
25
+ context 'with the pretty option' do
26
+ let(:options) { { pretty: true } }
28
27
 
29
- expect(stream.string).to eq("{\n \"foo\":\"bar\"}")
30
- end
28
+ it_behaves_like 'a json stream', pretty: true
31
29
 
32
- it 'respects the "between" option' do
33
- stream_writer.write_object
34
- stream_writer.write_key_value('foo', 'bar', between: ' ')
35
- stream_writer.close
30
+ it 'prettifies a basic array' do
31
+ stream_writer.write_array
32
+ stream_writer.write_element('foo')
33
+ stream_writer.close
34
+ expect(stream.string).to eq(<<~END.strip)
35
+ [
36
+ "foo"
37
+ ]
38
+ END
39
+ end
36
40
 
37
- expect(stream.string).to eq('{"foo": "bar"}')
41
+ it 'prettifies a basic object' do
42
+ stream_writer.write_object
43
+ stream_writer.write_key_value('foo', 'bar')
44
+ stream_writer.close
45
+ expect(stream.string).to eq(<<~END.strip)
46
+ {
47
+ "foo": "bar"
48
+ }
49
+ END
50
+ end
51
+
52
+ it 'prettifies a complex structure' do
53
+ stream_writer.write_object
54
+ stream_writer.write_array('foo')
55
+ stream_writer.write_element('bar')
56
+ stream_writer.write_object
57
+ stream_writer.write_key_value('baz', 'moo')
58
+ stream_writer.write_array('gaz')
59
+ stream_writer.write_element('doo')
60
+ stream_writer.close_array
61
+ stream_writer.close_object
62
+ stream_writer.write_element('kal')
63
+ stream_writer.close_array
64
+ stream_writer.write_array('jim')
65
+ stream_writer.write_element('jill')
66
+ stream_writer.write_array
67
+ stream_writer.write_element('john')
68
+ stream_writer.close
69
+ expect(stream.string).to eq(<<~END.strip)
70
+ {
71
+ "foo": [
72
+ "bar",
73
+ {
74
+ "baz": "moo",
75
+ "gaz": [
76
+ "doo"
77
+ ]
78
+ },
79
+ "kal"
80
+ ],
81
+ "jim": [
82
+ "jill",
83
+ [
84
+ "john"
85
+ ]
86
+ ]
87
+ }
88
+ END
89
+ end
90
+
91
+ context 'and the indent_size option' do
92
+ let(:options) { super().merge(indent_size: 4) }
93
+
94
+ it 'indents a basic object correctly' do
95
+ stream_writer.write_object
96
+ stream_writer.write_key_value('foo', 'bar')
97
+ stream_writer.close
98
+ expect(stream.string).to eq(<<~END.strip)
99
+ {
100
+ "foo": "bar"
101
+ }
102
+ END
103
+ end
104
+
105
+ it 'indents a more complicated object correctly' do
106
+ stream_writer.write_object
107
+ stream_writer.write_array('foo')
108
+ stream_writer.write_element('bar')
109
+ stream_writer.write_object
110
+ stream_writer.write_key_value('baz', 'moo')
111
+ stream_writer.close
112
+ expect(stream.string).to eq(<<~END.strip)
113
+ {
114
+ "foo": [
115
+ "bar",
116
+ {
117
+ "baz": "moo"
118
+ }
119
+ ]
120
+ }
121
+ END
122
+ end
123
+ end
38
124
  end
39
125
 
40
126
  describe '#close' do
@@ -11,8 +11,8 @@ describe JsonWriteStream::YieldingWriter do
11
11
 
12
12
  let(:stream_writer) { JsonWriteStream::YieldingWriter.new(stream) }
13
13
 
14
- def check_roundtrip(obj)
15
- YieldingRoundtripChecker.check_roundtrip(obj)
14
+ def check_roundtrip(obj, options = {})
15
+ YieldingRoundtripChecker.check_roundtrip(obj, options)
16
16
  end
17
17
 
18
18
  def utf8(str)
@@ -20,22 +20,7 @@ describe JsonWriteStream::YieldingWriter do
20
20
  end
21
21
 
22
22
  it_behaves_like 'a json stream'
23
-
24
- it 'respects the "before" option' do
25
- stream_writer.write_object do |object_writer|
26
- object_writer.write_key_value('foo', 'bar', before: "\n ")
27
- end
28
-
29
- expect(stream.string).to eq("{\n \"foo\":\"bar\"}")
30
- end
31
-
32
- it 'respects the "between" option' do
33
- stream_writer.write_object do |object_writer|
34
- object_writer.write_key_value('foo', 'bar', between: ' ')
35
- end
36
-
37
- expect(stream.string).to eq('{"foo": "bar"}')
38
- end
23
+ it_behaves_like 'a json stream', pretty: true
39
24
 
40
25
  describe '#write_key_value' do
41
26
  it 'converts all keys to strings' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-write-stream
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Dutro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-27 00:00:00.000000000 Z
11
+ date: 2019-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json_pure
@@ -32,7 +32,6 @@ extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
34
  - Gemfile
35
- - History.txt
36
35
  - README.md
37
36
  - Rakefile
38
37
  - json-write-stream.gemspec
@@ -64,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
63
  version: '0'
65
64
  requirements: []
66
65
  rubyforge_project:
67
- rubygems_version: 2.5.2
66
+ rubygems_version: 2.7.6
68
67
  signing_key:
69
68
  specification_version: 4
70
69
  summary: An easy, streaming way to generate JSON.
@@ -1,19 +0,0 @@
1
- == 1.0.0
2
-
3
- * Birthday!
4
-
5
- == 1.0.1
6
-
7
- * Support custom encodings (UTF-8, UTF-16, etc).
8
-
9
- == 1.0.2
10
-
11
- * Add flush methods
12
-
13
- == 1.1.0
14
-
15
- * Add way of inserting text after commas.
16
-
17
- == 1.2.0
18
-
19
- * Add way of inserting text between key/value pairs.