cbor 0.5.8.0 → 0.5.9.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
2
  SHA1:
3
- metadata.gz: f05161e936a40f076ec1389e1c2e0b3c780603b4
4
- data.tar.gz: 73ee9389cd9fdd7c826caef32f8730340c29a019
3
+ metadata.gz: 3f05745e0a68a5a628790baf2d44945a4ce57bae
4
+ data.tar.gz: 3eff2fd87b1d8ceba13dda6ad6809a4f2b8253be
5
5
  SHA512:
6
- metadata.gz: dc63dfca2f83dfba9fabaffed1b9142df775dbd05c47f541b5127428545dc1c5700148326662e57b1a0f5572af56367cf0a522d91bc52cea8d621730542942f8
7
- data.tar.gz: ca747d537cdd17c53f060819c45c22309859295a958d919a086e52496ef7a484f641e0e5f67c0da45bdb24e8013a4ce06cdb8a1a30d6e449e22614f445a206ff
6
+ metadata.gz: d3b24e6deceaf7061b8302c586f85f9c58eef81fdd92a376ccdcc6de410742ee9947990af2116e6948b8adb82703540d9c8cc3698eb7f7bb26c86373fdce9950
7
+ data.tar.gz: 1837146a082f666d20d377ad82c52bde5d7c05e24296a967f5184d123e7ca05cc7f3045cf51ee4c603514f0a72caf7a7366ba317998d440bf915d5431c0553cc
@@ -2,12 +2,19 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
- # - rbx-19mode
6
- - 2.1.0
5
+ - 2.1
7
6
  - ruby-head
7
+ - rbx-2
8
+ - 1.8.7
8
9
  matrix:
9
10
  allow_failures:
10
- - rvm: rbx-19mode # Rubinius issue #2742
11
+ - rvm: ruby-head
12
+ - rvm: rbx-2
13
+ - rvm: 1.8.7
14
+
15
+ gemfile:
16
+ - Gemfile
17
+
11
18
  script: "bundle exec rake spec"
12
19
 
13
20
  notifications:
data/ChangeLog CHANGED
@@ -1,3 +1,13 @@
1
+ 2014-12-13 Carsten Bormann <cabo@tzi.org>
2
+
3
+ * 0.5.9.0: Upstream fixes; prepare for Ruby 2.2 (use GC-able
4
+ symbols for :keys_as_symbols, use rb_integer_pack if available)
5
+
6
+ 2014-12-12 Carsten Bormann <cabo@tzi.org>
7
+
8
+ * 0.5.8.0: Upstream fixes (including {symbolize_keys: true} as an
9
+ alternative for :keys_as_symbols); README updates.
10
+
1
11
  2014-02-09 Carsten Bormann <cabo@tzi.org>
2
12
 
3
13
  * 0.5.6.4: Add more checking for bare indefinite breaks and
@@ -17,7 +17,7 @@ Use RubyGems to install:
17
17
 
18
18
  CBOR is an object representation format defined by the IETF[http://ietf.org].
19
19
  The specification[http://tools.ietf.org/html/rfc7049]
20
- has recently been approved as an IETF Standards-Track specification
20
+ is an IETF Standards-Track specification
21
21
  and has been published as RFC 7049.
22
22
 
23
23
  This is all based on wonderful work by frsyuki, and I have no idea how
@@ -37,9 +37,9 @@ Todos:
37
37
  get some documentation in the directory +doc+ (see +index.html+ there).
38
38
 
39
39
  * Cover more rubies.
40
- * \[✔✔✔] tested on MRI (1.9.3, 2.0.0, 2.1.0, head).
40
+ * \[✔✔✔✔] tested on MRI (1.9.3, 2.0.0, 2.1.5, 2.2 head).
41
41
  * (\[✔] There now also is some basic MRI 1.8.7 compatibility, however 1.8.7 does not support differentiation between byte and text strings.)
42
- * \[()] tested on Rubinius 2.1.1. Mostly works, but runs into a few Rubinius bugs, which have since been fixed on the Rubinius side. Need to retest on the next release.
42
+ * \[✔] tested on Rubinius 2.4.1.
43
43
  * \[_] Publish the pure-ruby version and make it work the same way on JRuby.
44
44
 
45
45
  * Find and implement good ways to offer CBOR's indefinite length
data/Rakefile CHANGED
@@ -52,6 +52,9 @@ else
52
52
  end
53
53
  end
54
54
 
55
+ CLEAN.include('lib/cbor/*.jar')
56
+ CLEAN.include('lib/cbor/cbor.*')
57
+
55
58
  task :default => :build
56
59
 
57
60
 
@@ -10,7 +10,6 @@ Gem::Specification.new do |s|
10
10
  s.email = "cabo@tzi.org"
11
11
  s.license = "Apache 2.0"
12
12
  s.homepage = "http://cbor.io/"
13
- # s.rubyforge_project = "msgpack"
14
13
  s.has_rdoc = false
15
14
  s.files = `git ls-files`.split("\n")
16
15
  s.test_files = `git ls-files -- {test,spec}/*`.split("\n")
@@ -454,6 +454,7 @@ static inline VALUE msgpack_buffer_read_top_as_string(msgpack_buffer_t* b, size_
454
454
 
455
455
  VALUE result;
456
456
  if (as_symbol) {
457
+ #ifndef HAVE_RB_STR_INTERN
457
458
  #ifndef HAVE_RB_INTERN_STR
458
459
  /* MRI 1.8 doesn't have rb_intern_str or rb_intern2, hack it... */
459
460
  char *tmp = xmalloc(length+1);
@@ -464,6 +465,10 @@ static inline VALUE msgpack_buffer_read_top_as_string(msgpack_buffer_t* b, size_
464
465
  #else
465
466
  result = ID2SYM(rb_intern2(b->read_buffer, length));
466
467
  /* FIXME: This is stuck at ASCII encoding */
468
+ #endif
469
+ #else
470
+ /* enable GC-able symbols here: */
471
+ result = rb_str_intern(rb_str_new(b->read_buffer, length));
467
472
  #endif
468
473
  /* todo: rb_check_id_cstr(const char *ptr, long len, rb_encoding *enc) */
469
474
  } else {
@@ -105,6 +105,9 @@
105
105
  # endif
106
106
  #endif
107
107
 
108
+
109
+ #ifndef HAVE_RB_INTEGER_UNPACK
110
+
108
111
  /* More MRI 1.8 */
109
112
  #ifndef RBIGNUM_LEN
110
113
  #define RBIGNUM_LEN(b) (RBIGNUM(b)->len)
@@ -122,6 +125,8 @@
122
125
  #define rb_big_new(len, sign) rb_funcall(INT2FIX(1),rb_intern("<<"),1,INT2FIX(len > 0 ? ((len) * SIZEOF_BDIGITS * 8) - 1 : 0));
123
126
  #endif
124
127
 
128
+ #endif
129
+
125
130
  #ifndef RB_TYPE_P
126
131
  #define RB_TYPE_P(obj, type) (TYPE(obj) == (type))
127
132
  #endif
@@ -5,6 +5,9 @@ have_header("st.h")
5
5
  have_func("rb_str_replace", ["ruby.h"])
6
6
  have_func("rb_big_new", ["ruby.h"])
7
7
  have_func("rb_intern_str", ["ruby.h"])
8
+ have_func("rb_sym2str", ["ruby.h"])
9
+ have_func("rb_str_intern", ["ruby.h"])
10
+ have_func("rb_integer_unpack", ["ruby.h"])
8
11
 
9
12
  $CFLAGS << %[ -I.. -Wall -O3 -g -std=c99]
10
13
  #$CFLAGS << %[ -DDISABLE_RMEM]
@@ -80,7 +80,7 @@ static inline void cbor_encoder_write_head(msgpack_packer_t* pk, unsigned int ib
80
80
  {
81
81
  if (n < 24) {
82
82
  msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), 1);
83
- msgpack_buffer_write_1(PACKER_BUFFER_(pk), ib + n);
83
+ msgpack_buffer_write_1(PACKER_BUFFER_(pk), ib + (int)n);
84
84
  } else if (n < 256) {
85
85
  msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), 3);
86
86
  msgpack_buffer_write_2(PACKER_BUFFER_(pk), ib + 24, n);
@@ -216,6 +216,10 @@ static inline void msgpack_packer_write_string_value(msgpack_packer_t* pk, VALUE
216
216
 
217
217
  static inline void msgpack_packer_write_symbol_value(msgpack_packer_t* pk, VALUE v)
218
218
  {
219
+ #ifdef HAVE_RB_SYM2STR
220
+ /* rb_sym2str is added since MRI 2.2.0 */
221
+ msgpack_packer_write_string_value(pk, rb_sym2str(v));
222
+ #else
219
223
  const char* name = rb_id2name(SYM2ID(v));
220
224
  /* actual return type of strlen is size_t */
221
225
  unsigned long len = strlen(name);
@@ -225,6 +229,7 @@ static inline void msgpack_packer_write_symbol_value(msgpack_packer_t* pk, VALUE
225
229
  }
226
230
  cbor_encoder_write_head(pk, IB_TEXT, len);
227
231
  msgpack_buffer_append(PACKER_BUFFER_(pk), name, len);
232
+ #endif
228
233
  }
229
234
 
230
235
  static inline void msgpack_packer_write_fixnum_value(msgpack_packer_t* pk, VALUE v)
@@ -244,7 +249,26 @@ static inline void msgpack_packer_write_bignum_value(msgpack_packer_t* pk, VALUE
244
249
  v = rb_funcall(v, rb_intern("~"), 0); /* should be rb_big_neg(), but that is static. */
245
250
  ib = IB_NEGATIVE;
246
251
  }
247
- len = RBIGNUM_LEN(v); /* This API is broken in Rubinius 2.1.1, #2742 */
252
+
253
+
254
+ #ifdef HAVE_RB_INTEGER_UNPACK
255
+ len = rb_absint_size(v, NULL);
256
+
257
+ if (len > SIZEOF_LONG_LONG) { /* i.e., need real bignum */
258
+ msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), 1);
259
+ msgpack_buffer_write_1(PACKER_BUFFER_(pk), IB_BIGNUM + IB_NEGFLAG_AS_BIT(ib));
260
+ cbor_encoder_write_head(pk, IB_BYTES, len);
261
+ msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), len);
262
+
263
+ char buf[len]; /* XXX */
264
+ if (rb_integer_pack(v, buf, len, 1, 0, INTEGER_PACK_BIG_ENDIAN) != 1)
265
+ rb_raise(rb_eRangeError, "cbor rb_integer_pack() error");
266
+
267
+ msgpack_buffer_append(PACKER_BUFFER_(pk), buf, len);
268
+
269
+ #else
270
+
271
+ len = RBIGNUM_LEN(v);
248
272
  if (len > SIZEOF_LONG_LONG/SIZEOF_BDIGITS) {
249
273
  msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), 1);
250
274
  msgpack_buffer_write_1(PACKER_BUFFER_(pk), IB_BIGNUM + IB_NEGFLAG_AS_BIT(ib));
@@ -296,6 +320,7 @@ static inline void msgpack_packer_write_bignum_value(msgpack_packer_t* pk, VALUE
296
320
  }
297
321
  #endif
298
322
  }
323
+ #endif
299
324
  } else {
300
325
  cbor_encoder_write_head(pk, ib, rb_big2ull(v));
301
326
  }
@@ -121,6 +121,8 @@
121
121
  /* TODO default impl for _msgpack_bsp32 */
122
122
  #endif
123
123
 
124
+ #ifndef HAVE_RB_INTEGER_UNPACK
125
+
124
126
  #if SIZEOF_BDIGITS == 2
125
127
  #define NTOHBDIGIT _msgpack_be16
126
128
  #elif SIZEOF_BDIGITS == 4
@@ -133,3 +135,5 @@
133
135
 
134
136
  #endif
135
137
 
138
+ #endif
139
+
@@ -422,7 +422,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
422
422
  union {
423
423
  uint32_t u32;
424
424
  float f;
425
- } castbuf = { val };
425
+ } castbuf = { (uint32_t)val };
426
426
  return object_complete(uk, rb_float_new(castbuf.f));
427
427
  }
428
428
  case AI_8: // double
@@ -476,6 +476,7 @@ int msgpack_unpacker_read_container_header(msgpack_unpacker_t* uk, uint64_t* res
476
476
  return PRIMITIVE_UNEXPECTED_TYPE; /* including INDEF! */
477
477
  }
478
478
 
479
+ reset_head_byte(uk);
479
480
  return 0;
480
481
  }
481
482
 
@@ -514,11 +515,19 @@ static VALUE msgpack_unpacker_process_tag(uint64_t tag, VALUE v) {
514
515
  #endif
515
516
  {
516
517
  char *sp = RSTRING_PTR(v);
517
- int slen = RSTRING_LEN(v);
518
+ size_t slen = RSTRING_LEN(v);
518
519
  while (slen && *sp == 0) {
519
520
  slen--;
520
521
  sp++;
521
522
  }
523
+
524
+ #ifdef HAVE_RB_INTEGER_UNPACK
525
+
526
+ res = rb_integer_unpack(sp, slen, 1, 0, INTEGER_PACK_BIG_ENDIAN);
527
+ /* (const void *words, size_t numwords, size_t wordsize, size_t nails, int flags); */
528
+
529
+ #else
530
+
522
531
  #ifndef CANT_DO_BIGNUMS_FAST_ON_THIS_PLATFORM
523
532
  int ndig = (slen + SIZEOF_BDIGITS - 1)/SIZEOF_BDIGITS;
524
533
  res = rb_big_new(ndig, 1);
@@ -554,6 +563,7 @@ static VALUE msgpack_unpacker_process_tag(uint64_t tag, VALUE v) {
554
563
  res = rb_cstr2inum(hex, 16);
555
564
  xfree(hex);
556
565
  }
566
+ #endif
557
567
  #endif
558
568
  if (tag == TAG_BIGNUM) /* non-negative */
559
569
  #ifndef CANT_DO_BIGNUMS_FAST_ON_THIS_PLATFORM
@@ -626,7 +636,7 @@ int msgpack_unpacker_read(msgpack_unpacker_t* uk, size_t target_stack_depth)
626
636
  continue;
627
637
  case STACK_TYPE_STRING_INDEF:
628
638
  if (r == PRIMITIVE_BREAK) {
629
- object_complete_string(uk, top->object, top->count); /* use count as textflag */
639
+ object_complete_string(uk, top->object, (int)top->count); /* use count as textflag */
630
640
  goto done;
631
641
  }
632
642
  if (!RB_TYPE_P(uk->last_object, T_STRING))
@@ -1,3 +1,3 @@
1
1
  module CBOR
2
- VERSION = "0.5.8.0"
2
+ VERSION = "0.5.9.0"
3
3
  end
@@ -231,6 +231,17 @@ describe MessagePack do
231
231
  match obj, "\xA0"
232
232
  end
233
233
 
234
+ it "very simple bignums" do
235
+ CBOR.decode("\xc2\x40").should == 0
236
+ CBOR.decode("\xc2\x41\x00").should == 0
237
+ CBOR.decode("\xc2\x41a").should == 97
238
+ CBOR.decode("\xc2\x42aa").should == 24929
239
+ CBOR.decode("\xc3\x40").should == ~0
240
+ CBOR.decode("\xc3\x41\x00").should == ~0
241
+ CBOR.decode("\xc3\x41a").should == ~97
242
+ CBOR.decode("\xc3\x42aa").should == ~24929
243
+ end
244
+
234
245
  it "0x982173487123985791827359872948752345" do
235
246
  check_bn(0x982173487123985791827359872948752345, 0xc2)
236
247
  check_bn(-0x982173487123985791827359872948752345, 0xc3)
@@ -1,8 +1,23 @@
1
+ require 'rubygems' # for 1.8
2
+
3
+ RSpec.configure do |config|
4
+ config.expect_with :rspec do |c|
5
+ c.syntax = [:should, :expect]
6
+ end
7
+ config.mock_with :rspec do |c|
8
+ c.syntax = [:should, :expect]
9
+ end
10
+ end
11
+
12
+
1
13
  class String
2
14
  if ''.respond_to? :encode
3
15
  def encode_as_utf8
4
16
  encode(Encoding::UTF_8)
5
17
  end
18
+ def force_as_utf8
19
+ force_encoding(Encoding::UTF_8)
20
+ end
6
21
  unless String.instance_methods.include?(:b)
7
22
  def b
8
23
  dup.force_encoding(Encoding::BINARY)
@@ -12,10 +27,18 @@ class String
12
27
  def encode_as_utf8
13
28
  self # MRI 1.8
14
29
  end
30
+ def force_as_utf8
31
+ self # MRI 1.8
32
+ end
15
33
  def b
16
34
  self
17
35
  end
18
36
  end
37
+ unless ''.respond_to? :clear
38
+ def clear
39
+ replace('')
40
+ end
41
+ end
19
42
  def hexbytes(sep = '')
20
43
  bytes.map{|x| "%02x" % x}.join(sep)
21
44
  end
@@ -24,11 +24,33 @@ describe Unpacker do
24
24
  }.should raise_error(MessagePack::TypeError)
25
25
  end
26
26
 
27
+ it 'read_array_header converts an array to value sequence' do
28
+ packer.write_array_header(2)
29
+ packer.write("e")
30
+ packer.write(1)
31
+ unpacker = Unpacker.new
32
+ unpacker.feed(packer.to_s)
33
+ unpacker.read_array_header.should == 2
34
+ unpacker.read.should == "e"
35
+ unpacker.read.should == 1
36
+ end
37
+
27
38
  it 'read_map_header succeeds' do
28
39
  unpacker.feed("\xa1")
29
40
  unpacker.read_map_header.should == 1
30
41
  end
31
42
 
43
+ it 'read_map_header converts an map to key-value sequence' do
44
+ packer.write_map_header(1)
45
+ packer.write("k")
46
+ packer.write("v")
47
+ unpacker = Unpacker.new
48
+ unpacker.feed(packer.to_s)
49
+ unpacker.read_map_header.should == 1
50
+ unpacker.read.should == "k"
51
+ unpacker.read.should == "v"
52
+ end
53
+
32
54
  it 'read_map_header fails' do
33
55
  unpacker.feed("\x81")
34
56
  lambda {
@@ -144,14 +166,14 @@ describe Unpacker do
144
166
  end
145
167
 
146
168
  it 'frozen short strings' do
147
- raw = sample_object.to_cbor.to_s.force_encoding('UTF-8')
169
+ raw = sample_object.to_cbor.to_s.force_as_utf8
148
170
  lambda {
149
171
  unpacker.feed_each(raw.freeze) { }
150
172
  }.should_not raise_error
151
173
  end
152
174
 
153
175
  it 'frozen long strings' do
154
- raw = (sample_object.to_cbor.to_s * 10240).force_encoding('UTF-8')
176
+ raw = (sample_object.to_cbor.to_s * 10240).force_as_utf8
155
177
  lambda {
156
178
  unpacker.feed_each(raw.freeze) { }
157
179
  }.should_not raise_error
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cbor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.8.0
4
+ version: 0.5.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann, standing on the tall shoulders of Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-12 00:00:00.000000000 Z
11
+ date: 2014-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -176,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
176
  version: '0'
177
177
  requirements: []
178
178
  rubyforge_project:
179
- rubygems_version: 2.2.2
179
+ rubygems_version: 2.4.5
180
180
  signing_key:
181
181
  specification_version: 4
182
182
  summary: CBOR, Concise Binary Object Representation.