cbor 0.5.8.0 → 0.5.9.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
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.