json-write-stream 1.2.0 → 2.0.0

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
- 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.