usamin 7.7.8 → 7.7.9

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
  SHA256:
3
- metadata.gz: 71c3b83f7f671964b34398dac52063e4619fcf69352a54a6b6d28c175d3c01ca
4
- data.tar.gz: 60599d9808d0504dacb2a0fe96372072cb7e5c779cd84753353dff53ff309337
3
+ metadata.gz: db59b9c360567cf33fca6506bbd06ad9b31c1382a09b31d13cd1c81c530fbdd0
4
+ data.tar.gz: c675678f1eec5cd39fae70733f36302664e020981a5d850c12536d755e9c9d7d
5
5
  SHA512:
6
- metadata.gz: 2e3ceb27b8f0c2f78ecc7c4fb1a4cad9d8d319ab1501e23fc804886a92ef6b6ec1b403bed9c7cbb59e03d1b78753535d8fd2d153622281924fa1ebf0e6c81668
7
- data.tar.gz: 022e9d44c3be7e8f1e4f423d35837a0c31ef5ef3a32d801fd965c5d5ff25a76372d5ce41fda0d40576765a1d273fbe4a8fdad41543ee63e4301b5f127475c706
6
+ metadata.gz: 78f82ae393b94944759de05c6e8dcc01524b9e60041f9fb13c72dbf43319265f6ad3aef8c226f23dcd8e205ee8385d0a773b7a1271a403b81bc6f093fca928ac
7
+ data.tar.gz: e51369d0d04fb97f9018c0734f3f72df4c404388234baa5f9db61b8c36380f2c197626df512906d3241dbbdc75938946a8d657e086f0263d3b94dc63afa46f03
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ Gemfile.lock
16
16
  .DS_Store
17
17
  /testdata/
18
18
  /vendor/
19
+ /.vscode/
data/README.md CHANGED
@@ -69,9 +69,10 @@ Usamin.parse(json)
69
69
 
70
70
  ```ruby
71
71
  data = Usamin.load(json)
72
+ #=> => [{...}, {...}]
72
73
  ```
73
74
 
74
- Here, `data` is not a Array, but this can be handled like an Array.
75
+ Here, `data` is not an Array, but this can be handled like an Array.
75
76
 
76
77
  ```ruby
77
78
  data.size
@@ -107,7 +108,7 @@ Usamin.load(json).eval_r
107
108
  #### Notes about lazy loading data
108
109
 
109
110
  - Frozen. Modification is not allowed.
110
- - A key list of Hash is based on not hash tables but arrays. An index access to hash costs O(n).
111
+ - Hash objects are based on not hash tables but arrays. An index access to an object costs O(n).
111
112
 
112
113
  ### Generating
113
114
 
@@ -39,7 +39,7 @@ typedef rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::MemoryPoolAlloc
39
39
 
40
40
  rb_encoding *utf8;
41
41
  int utf8index;
42
- ID id_to_s;
42
+ ID id_dig, id_to_s;
43
43
  VALUE rb_cUsaminValue, rb_cUsaminHash, rb_cUsaminArray, rb_eUsaminError, rb_eParserError;
44
44
  VALUE utf8value, sym_fast, sym_indent, sym_single_line_array;
45
45
 
@@ -270,6 +270,110 @@ static inline VALUE eval_array_r(RubynizedValue &value) {
270
270
  return ret;
271
271
  }
272
272
 
273
+ static bool eql_array(RubynizedValue&, RubynizedValue&);
274
+ static bool eql_object(RubynizedValue&, RubynizedValue&);
275
+
276
+ static bool eql_value(RubynizedValue &self, RubynizedValue &other) {
277
+ if (self.GetType() != other.GetType())
278
+ return false;
279
+ switch (self.GetType()) {
280
+ case rapidjson::kObjectType:
281
+ return eql_object(self, other);
282
+ case rapidjson::kArrayType:
283
+ return eql_array(self, other);
284
+ case rapidjson::kStringType:
285
+ return self == other;
286
+ case rapidjson::kNumberType:
287
+ return self == other && self.IsInt() == other.IsInt() &&
288
+ self.IsUint() == other.IsUint() && self.IsInt64() == other.IsInt64() &&
289
+ self.IsUint64() == other.IsUint64() && self.IsDouble() == other.IsDouble();
290
+ default:
291
+ return true;
292
+ }
293
+ }
294
+
295
+ static bool eql_object(RubynizedValue &self, RubynizedValue &other) {
296
+ if (self.MemberCount() != other.MemberCount())
297
+ return false;
298
+ for (auto &m : self.GetObject()) {
299
+ if (!other.HasMember(m.name))
300
+ return false;
301
+ if (!eql_value(m.value, other[m.name]))
302
+ return false;
303
+ }
304
+ return true;
305
+ }
306
+
307
+ static bool eql_array(RubynizedValue &self, RubynizedValue &other) {
308
+ if (self.Size() != other.Size())
309
+ return false;
310
+ for (rapidjson::SizeType i = 0; i < self.Size(); i++) {
311
+ if (!eql_value(self[i], other[i]))
312
+ return false;
313
+ }
314
+ return true;
315
+ }
316
+
317
+ static st_index_t hash_object(RubynizedValue &value);
318
+ static st_index_t hash_array(RubynizedValue &value);
319
+
320
+ static st_index_t hash_value(RubynizedValue &value) {
321
+ auto type = value.GetType();
322
+ st_index_t h = rb_hash_start((st_index_t)type);
323
+ rb_hash_uint(h, (st_index_t)hash_value);
324
+ switch (type) {
325
+ case rapidjson::kNullType:
326
+ h = rb_hash_uint(h, NUM2LONG(rb_hash(Qnil)));
327
+ break;
328
+ case rapidjson::kFalseType:
329
+ h = rb_hash_uint(h, NUM2LONG(rb_hash(Qfalse)));
330
+ break;
331
+ case rapidjson::kTrueType:
332
+ h = rb_hash_uint(h, NUM2LONG(rb_hash(Qtrue)));
333
+ break;
334
+ case rapidjson::kObjectType:
335
+ h = rb_hash_uint(h, hash_object(value));
336
+ break;
337
+ case rapidjson::kArrayType:
338
+ h = rb_hash_uint(h, hash_array(value));
339
+ break;
340
+ case rapidjson::kStringType:
341
+ h = rb_hash_uint(h, rb_str_hash(eval_str(value)));
342
+ break;
343
+ case rapidjson::kNumberType:
344
+ if (value.IsInt())
345
+ h = rb_hash_uint(h, 0x770);
346
+ if (value.IsUint())
347
+ h = rb_hash_uint(h, 0x771);
348
+ if (value.IsInt64())
349
+ h = rb_hash_uint(h, 0x772);
350
+ if (value.IsUint64())
351
+ h = rb_hash_uint(h, 0x773);
352
+ if (value.IsDouble())
353
+ h = rb_hash_uint(h, 0x774);
354
+ h = rb_hash_uint(h, NUM2LONG(rb_hash(eval_num(value))));
355
+ }
356
+ return rb_hash_end(h);
357
+ }
358
+
359
+ static st_index_t hash_object(RubynizedValue &value) {
360
+ st_index_t h = rb_hash_start(value.MemberCount());
361
+ h = rb_hash_uint(h, (st_index_t)hash_object);
362
+ for (auto &m : value.GetObject()) {
363
+ h = rb_hash_uint(h, rb_str_hash(eval_str(m.name)));
364
+ h = rb_hash_uint(h, hash_value(m.value));
365
+ }
366
+ return rb_hash_end(h);
367
+ }
368
+
369
+ static st_index_t hash_array(RubynizedValue &value) {
370
+ st_index_t h = rb_hash_start(value.Size());
371
+ h = rb_hash_uint(h, (st_index_t)hash_array);
372
+ for (auto &v : value.GetArray())
373
+ h = rb_hash_uint(h, hash_value(v));
374
+ return rb_hash_end(h);
375
+ }
376
+
273
377
 
274
378
  template <class Writer> static inline void write_str(Writer&, const VALUE);
275
379
  template <class Writer> static inline void write_hash(Writer&, const VALUE);
@@ -515,6 +619,32 @@ static VALUE w_parse(const int argc, const VALUE *argv, const VALUE self) {
515
619
  return eval_r(doc);
516
620
  }
517
621
 
622
+ /*
623
+ * Returns whether the value is equals to the other value.
624
+ *
625
+ * @return [Boolean]
626
+ */
627
+ static VALUE w_value_equal(const VALUE self, const VALUE other) {
628
+ if (self == other)
629
+ return Qtrue;
630
+ UsaminValue *value_self = get_value(self);
631
+ check_value(value_self);
632
+ if (rb_obj_is_kind_of(other, rb_cUsaminValue)) {
633
+ UsaminValue *value_other = get_value(other);
634
+ check_value(value_other);
635
+ return value_self->value->operator==(*value_other->value) ? Qtrue : Qfalse;
636
+ } else if (value_self->value->IsArray() && RB_TYPE_P(other, T_ARRAY)) {
637
+ if (value_self->value->Size() != RARRAY_LEN(other))
638
+ return Qfalse;
639
+ return rb_equal(other, eval_array(*value_self->value, value_self->root_document));
640
+ } else if (value_self->value->IsObject() && RB_TYPE_P(other, T_HASH)) {
641
+ if (value_self->value->MemberCount() != RHASH_SIZE(other))
642
+ return Qfalse;
643
+ return rb_equal(other, eval_object(*value_self->value, value_self->root_document));
644
+ }
645
+ return Qfalse;
646
+ }
647
+
518
648
  /*
519
649
  * Returns whether the value is array.
520
650
  */
@@ -560,6 +690,21 @@ static VALUE w_value_eval_r(const VALUE self) {
560
690
  return eval_r(*(value->value));
561
691
  }
562
692
 
693
+ /*
694
+ * @return [Boolean]
695
+ */
696
+ static VALUE w_value_eql(const VALUE self, const VALUE other) {
697
+ if (self == other)
698
+ return Qtrue;
699
+ if (!rb_obj_is_kind_of(other, rb_cUsaminValue))
700
+ return Qfalse;
701
+ UsaminValue *value_self = get_value(self);
702
+ UsaminValue *value_other = get_value(other);
703
+ check_value(value_self);
704
+ check_value(value_other);
705
+ return eql_value(*value_self->value, *value_other->value) ? Qtrue : Qfalse;
706
+ }
707
+
563
708
  /*
564
709
  * Always true.
565
710
  */
@@ -567,6 +712,15 @@ static VALUE w_value_isfrozen(const VALUE self) {
567
712
  return Qtrue;
568
713
  }
569
714
 
715
+ /*
716
+ * @return [Integer]
717
+ */
718
+ static VALUE w_value_hash(const VALUE self) {
719
+ UsaminValue *value = get_value(self);
720
+ check_value(value);
721
+ return ST2FIX(hash_value(*value->value));
722
+ }
723
+
570
724
  /*
571
725
  * Returns root object.
572
726
  *
@@ -657,6 +811,20 @@ static VALUE w_hash_compact(const VALUE self) {
657
811
  return hash;
658
812
  }
659
813
 
814
+ /*
815
+ * @return [Object | nil]
816
+ */
817
+ static VALUE w_hash_dig(const int argc, const VALUE *argv, const VALUE self) {
818
+ rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
819
+ VALUE value = w_hash_operator_indexer(self, argv[0]);
820
+ if (argc == 1)
821
+ return value;
822
+ else if (value == Qnil)
823
+ return Qnil;
824
+ else
825
+ return rb_funcall3(value, id_dig, argc - 1, argv + 1);
826
+ }
827
+
660
828
  static VALUE hash_enum_size(const VALUE self, const VALUE args, const VALUE eobj) {
661
829
  return UINT2NUM(get_value(self)->value->MemberCount());
662
830
  }
@@ -767,6 +935,49 @@ static VALUE w_hash_fetch_values(const int argc, VALUE *argv, const VALUE self)
767
935
  return ret;
768
936
  }
769
937
 
938
+ static void flatten_array(RubynizedValue &value, VALUE array, int level, VALUE root_document);
939
+
940
+ /*
941
+ * @overload flatten(level = 1)
942
+ * @return [::Array<Object>]
943
+ */
944
+ static VALUE w_hash_flatten(const int argc, const VALUE *argv, const VALUE self) {
945
+ rb_check_arity(argc, 0, 1);
946
+ UsaminValue *value = get_value(self);
947
+ check_object(value);
948
+
949
+ int level = 1;
950
+ if (argc == 1 && !NIL_P(argv[0])) {
951
+ level = NUM2INT(argv[0]);
952
+ if (level < 0)
953
+ level = -1;
954
+ }
955
+
956
+ if (level == 0) {
957
+ VALUE ret = rb_ary_new2(value->value->MemberCount());
958
+ for (auto &m : value->value->GetObject())
959
+ rb_ary_push(ret, rb_ary_new3(2, eval_str(m.name), eval(m.value, value->root_document)));
960
+ return ret;
961
+ }
962
+
963
+ VALUE ret = rb_ary_new2(value->value->MemberCount() * 2);
964
+ if (level == 1) {
965
+ for (auto &m : value->value->GetObject()) {
966
+ rb_ary_push(ret, eval_str(m.name));
967
+ rb_ary_push(ret, eval(m.value, value->root_document));
968
+ }
969
+ } else {
970
+ for (auto &m : value->value->GetObject()) {
971
+ rb_ary_push(ret, eval_str(m.name));
972
+ if (m.value.IsArray())
973
+ flatten_array(m.value, ret, level > 0 ? level - 2 : level, value->root_document);
974
+ else
975
+ rb_ary_push(ret, eval(m.value, value->root_document));
976
+ }
977
+ }
978
+ return ret;
979
+ }
980
+
770
981
  /*
771
982
  * @note This method has linear time complexity.
772
983
  */
@@ -800,6 +1011,36 @@ static VALUE w_hash_key(const VALUE self, const VALUE val) {
800
1011
  return Qnil;
801
1012
  }
802
1013
 
1014
+ /*
1015
+ * @return [String]
1016
+ */
1017
+ static VALUE w_hash_inspect(const VALUE self) {
1018
+ UsaminValue *value = get_value(self);
1019
+ check_object(value);
1020
+ VALUE ret = rb_str_new2("{");
1021
+ bool first = true;
1022
+ for (auto &m : value->value->GetObject()) {
1023
+ if (!first)
1024
+ ret = rb_str_cat2(ret, ", ");
1025
+ ret = rb_str_append(ret, rb_inspect(eval_str(m.name)));
1026
+ ret = rb_str_cat2(ret, "=>");
1027
+ switch (m.value.GetType()) {
1028
+ case rapidjson::kObjectType:
1029
+ ret = rb_str_cat2(ret, "{...}");
1030
+ break;
1031
+ case rapidjson::kArrayType:
1032
+ ret = rb_str_cat2(ret, "[...]");
1033
+ break;
1034
+ default:
1035
+ ret = rb_str_append(ret, rb_inspect(eval(m.value, value->root_document)));
1036
+ break;
1037
+ }
1038
+ first = false;
1039
+ }
1040
+ ret = rb_str_cat2(ret, "}");
1041
+ return ret;
1042
+ }
1043
+
803
1044
  /*
804
1045
  * @return [::Array<String>]
805
1046
  */
@@ -1068,6 +1309,20 @@ static VALUE w_array_compact(const VALUE self, const VALUE nth) {
1068
1309
  return ret;
1069
1310
  }
1070
1311
 
1312
+ /*
1313
+ * @return [Object | nil]
1314
+ */
1315
+ static VALUE w_array_dig(const int argc, const VALUE *argv, const VALUE self) {
1316
+ rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
1317
+ VALUE value = w_array_at(self, argv[0]);
1318
+ if (argc == 1)
1319
+ return value;
1320
+ else if (value == Qnil)
1321
+ return Qnil;
1322
+ else
1323
+ return rb_funcall3(value, id_dig, argc - 1, argv + 1);
1324
+ }
1325
+
1071
1326
  static VALUE array_enum_size(const VALUE self, const VALUE args, const VALUE eobj) {
1072
1327
  return UINT2NUM(get_value(self)->value->Size());
1073
1328
  }
@@ -1173,6 +1428,39 @@ static VALUE w_array_find_index(const int argc, const VALUE *argv, const VALUE s
1173
1428
  return Qnil;
1174
1429
  }
1175
1430
 
1431
+ static void flatten_array(RubynizedValue &value, VALUE array, int level, VALUE root_document) {
1432
+ if (level == 0)
1433
+ for (auto &v : value.GetArray())
1434
+ rb_ary_push(array, eval(v, root_document));
1435
+ else
1436
+ for (auto &v : value.GetArray())
1437
+ if (v.IsArray())
1438
+ flatten_array(v, array, level > 0 ? level - 1 : level, root_document);
1439
+ else
1440
+ rb_ary_push(array, eval(v, root_document));
1441
+ }
1442
+
1443
+ /*
1444
+ * @overload flatten(lv = nil)
1445
+ * @return [::Array<Object>]
1446
+ */
1447
+ static VALUE w_array_flatten(const int argc, const VALUE *argv, const VALUE self) {
1448
+ rb_check_arity(argc, 0, 1);
1449
+ UsaminValue *value = get_value(self);
1450
+ check_array(value);
1451
+
1452
+ int level = -1;
1453
+ if (argc == 1 && !NIL_P(argv[0])) {
1454
+ level = NUM2INT(argv[0]);
1455
+ if (level <= 0)
1456
+ return eval_array(*value->value, value->root_document);
1457
+ }
1458
+
1459
+ VALUE ret = rb_ary_new2(value->value->Size());
1460
+ flatten_array(*value->value, ret, level, value->root_document);
1461
+ return ret;
1462
+ }
1463
+
1176
1464
  /*
1177
1465
  * @overload index(val)
1178
1466
  * @param [Object] val
@@ -1227,6 +1515,34 @@ static VALUE w_array_include(const VALUE self, const VALUE val) {
1227
1515
  return Qfalse;
1228
1516
  }
1229
1517
 
1518
+ /*
1519
+ * @return [String]
1520
+ */
1521
+ static VALUE w_array_inspect(const VALUE self) {
1522
+ UsaminValue *value = get_value(self);
1523
+ check_array(value);
1524
+ VALUE ret = rb_str_new2("[");
1525
+ bool first = true;
1526
+ for (auto &v : value->value->GetArray()) {
1527
+ if (!first)
1528
+ ret = rb_str_cat2(ret, ", ");
1529
+ switch (v.GetType()) {
1530
+ case rapidjson::kObjectType:
1531
+ ret = rb_str_cat2(ret, "{...}");
1532
+ break;
1533
+ case rapidjson::kArrayType:
1534
+ ret = rb_str_cat2(ret, "[...]");
1535
+ break;
1536
+ default:
1537
+ ret = rb_str_append(ret, rb_inspect(eval(v, value->root_document)));
1538
+ break;
1539
+ }
1540
+ first = false;
1541
+ }
1542
+ ret = rb_str_cat2(ret, "]");
1543
+ return ret;
1544
+ }
1545
+
1230
1546
  /*
1231
1547
  * @overload last
1232
1548
  * @return [Object | nil]
@@ -1262,6 +1578,86 @@ static VALUE w_array_length(const VALUE self) {
1262
1578
  return UINT2NUM(value->value->Size());
1263
1579
  }
1264
1580
 
1581
+ /*
1582
+ * @return [::Array<Object>]
1583
+ */
1584
+ static VALUE w_array_reverse(const VALUE self) {
1585
+ UsaminValue *value = get_value(self);
1586
+ check_array(value);
1587
+
1588
+ VALUE ret = rb_ary_new2(value->value->Size());
1589
+ for (rapidjson::SizeType i = 0, j = value->value->Size() - 1; i < value->value->Size(); i++, j--)
1590
+ rb_ary_push(ret, eval((*value->value)[j], value->root_document));
1591
+ return ret;
1592
+ }
1593
+
1594
+ /*
1595
+ * @overload rindex(val)
1596
+ * @param [Object] val
1597
+ * @return [Integer | nil]
1598
+ *
1599
+ * @overload rindex
1600
+ * @yield [item]
1601
+ * @yieldparam item [Object]
1602
+ * @return [Integer | nil]
1603
+ */
1604
+ static VALUE w_array_rindex(const int argc, const VALUE *argv, const VALUE self) {
1605
+ rb_check_arity(argc, 0, 1);
1606
+ UsaminValue *value = get_value(self);
1607
+ check_array(value);
1608
+
1609
+ if (argc == 1) {
1610
+ for (rapidjson::SizeType i = 0, j = value->value->Size() - 1; i < value->value->Size(); i++, j--) {
1611
+ if (rb_equal(argv[0], eval_r((*value->value)[j])) == Qtrue)
1612
+ return UINT2NUM(j);
1613
+ }
1614
+ return Qnil;
1615
+ }
1616
+
1617
+ RETURN_SIZED_ENUMERATOR(self, 0, nullptr, array_enum_size);
1618
+ for (rapidjson::SizeType i = 0, j = value->value->Size() - 1; i < value->value->Size(); i++, j--) {
1619
+ if (RTEST(rb_yield(eval((*value->value)[j], value->root_document))))
1620
+ return UINT2NUM(j);
1621
+ }
1622
+ return Qnil;
1623
+ }
1624
+
1625
+ /*
1626
+ * @overload rotate(cnt = 1)
1627
+ * @return [::Array<Object>]
1628
+ */
1629
+ static VALUE w_array_rotate(const int argc, const VALUE *argv, const VALUE self) {
1630
+ rb_check_arity(argc, 0, 1);
1631
+ UsaminValue *value = get_value(self);
1632
+ check_array(value);
1633
+
1634
+ switch (value->value->Size()) {
1635
+ case 0:
1636
+ return rb_ary_new();
1637
+ case 1:
1638
+ return rb_ary_new3(1, eval(value->value->operator[](0), value->root_document));
1639
+ }
1640
+
1641
+ int cnt = argc == 1 ? NUM2INT(argv[0]) : 1;
1642
+ if (cnt >= 0) {
1643
+ cnt = cnt % value->value->Size();
1644
+ } else {
1645
+ cnt = -cnt % value->value->Size();
1646
+ if (cnt)
1647
+ cnt = value->value->Size() - cnt;
1648
+ }
1649
+ if (cnt == 0)
1650
+ return eval_array(*(value->value), value->root_document);
1651
+
1652
+ rapidjson::SizeType ucnt = cnt;
1653
+ VALUE ret = rb_ary_new2(value->value->Size());
1654
+ for (rapidjson::SizeType i = ucnt; i < value->value->Size(); i++)
1655
+ rb_ary_push(ret, eval((*value->value)[i], value->root_document));
1656
+ for (rapidjson::SizeType i = 0; i < ucnt; i++)
1657
+ rb_ary_push(ret, eval((*value->value)[i], value->root_document));
1658
+ return ret;
1659
+ }
1660
+
1265
1661
  /*
1266
1662
  * @overload slice(nth)
1267
1663
  * @param [Integer] nth
@@ -1371,6 +1767,7 @@ extern "C" void Init_usamin(void) {
1371
1767
  sym_fast = rb_id2sym(rb_intern("fast"));
1372
1768
  sym_indent = rb_id2sym(rb_intern("indent"));
1373
1769
  sym_single_line_array = rb_id2sym(rb_intern("single_line_array"));
1770
+ id_dig = rb_intern("dig");
1374
1771
  id_to_s = rb_intern("to_s");
1375
1772
 
1376
1773
  VALUE rb_mUsamin = rb_define_module("Usamin");
@@ -1382,12 +1779,16 @@ extern "C" void Init_usamin(void) {
1382
1779
  rb_cUsaminValue = rb_define_class_under(rb_mUsamin, "Value", rb_cObject);
1383
1780
  rb_undef_alloc_func(rb_cUsaminValue);
1384
1781
  rb_undef_method(rb_cUsaminValue, "initialize");
1782
+ rb_define_method(rb_cUsaminValue, "==", RUBY_METHOD_FUNC(w_value_equal), 1);
1783
+ rb_define_method(rb_cUsaminValue, "===", RUBY_METHOD_FUNC(w_value_equal), 1);
1385
1784
  rb_define_method(rb_cUsaminValue, "array?", RUBY_METHOD_FUNC(w_value_isarray), 0);
1386
1785
  rb_define_method(rb_cUsaminValue, "hash?", RUBY_METHOD_FUNC(w_value_isobject), 0);
1387
1786
  rb_define_method(rb_cUsaminValue, "object?", RUBY_METHOD_FUNC(w_value_isobject), 0);
1388
1787
  rb_define_method(rb_cUsaminValue, "eval", RUBY_METHOD_FUNC(w_value_eval), 0);
1389
1788
  rb_define_method(rb_cUsaminValue, "eval_r", RUBY_METHOD_FUNC(w_value_eval_r), 0);
1789
+ rb_define_method(rb_cUsaminValue, "eql?", RUBY_METHOD_FUNC(w_value_eql), 1);
1390
1790
  rb_define_method(rb_cUsaminValue, "frozen?", RUBY_METHOD_FUNC(w_value_isfrozen), 0);
1791
+ rb_define_method(rb_cUsaminValue, "hash", RUBY_METHOD_FUNC(w_value_hash), 0);
1391
1792
  rb_define_method(rb_cUsaminValue, "root", RUBY_METHOD_FUNC(w_value_root), 0);
1392
1793
 
1393
1794
  rb_cUsaminHash = rb_define_class_under(rb_mUsamin, "Hash", rb_cUsaminValue);
@@ -1397,6 +1798,7 @@ extern "C" void Init_usamin(void) {
1397
1798
  rb_define_method(rb_cUsaminHash, "[]", RUBY_METHOD_FUNC(w_hash_operator_indexer), 1);
1398
1799
  rb_define_method(rb_cUsaminHash, "assoc", RUBY_METHOD_FUNC(w_hash_assoc), 1);
1399
1800
  rb_define_method(rb_cUsaminHash, "compact", RUBY_METHOD_FUNC(w_hash_compact), 0);
1801
+ rb_define_method(rb_cUsaminHash, "dig", RUBY_METHOD_FUNC(w_hash_dig), -1);
1400
1802
  rb_define_method(rb_cUsaminHash, "each", RUBY_METHOD_FUNC(w_hash_each), 0);
1401
1803
  rb_define_method(rb_cUsaminHash, "each_pair", RUBY_METHOD_FUNC(w_hash_each), 0);
1402
1804
  rb_define_method(rb_cUsaminHash, "each_key", RUBY_METHOD_FUNC(w_hash_each_key), 0);
@@ -1404,6 +1806,7 @@ extern "C" void Init_usamin(void) {
1404
1806
  rb_define_method(rb_cUsaminHash, "empty?", RUBY_METHOD_FUNC(w_hash_isempty), 0);
1405
1807
  rb_define_method(rb_cUsaminHash, "fetch", RUBY_METHOD_FUNC(w_hash_fetch), -1);
1406
1808
  rb_define_method(rb_cUsaminHash, "fetch_values", RUBY_METHOD_FUNC(w_hash_fetch_values), -1);
1809
+ rb_define_method(rb_cUsaminHash, "flatten", RUBY_METHOD_FUNC(w_hash_flatten), -1);
1407
1810
  rb_define_method(rb_cUsaminHash, "has_key?", RUBY_METHOD_FUNC(w_hash_haskey), 1);
1408
1811
  rb_define_method(rb_cUsaminHash, "include?", RUBY_METHOD_FUNC(w_hash_haskey), 1);
1409
1812
  rb_define_method(rb_cUsaminHash, "key?", RUBY_METHOD_FUNC(w_hash_haskey), 1);
@@ -1412,6 +1815,8 @@ extern "C" void Init_usamin(void) {
1412
1815
  rb_define_method(rb_cUsaminHash, "value?", RUBY_METHOD_FUNC(w_hash_hasvalue), 1);
1413
1816
  rb_define_method(rb_cUsaminHash, "key", RUBY_METHOD_FUNC(w_hash_key), 1);
1414
1817
  rb_define_method(rb_cUsaminHash, "index", RUBY_METHOD_FUNC(w_hash_key), 1);
1818
+ rb_define_method(rb_cUsaminHash, "inspect", RUBY_METHOD_FUNC(w_hash_inspect), 0);
1819
+ rb_define_method(rb_cUsaminHash, "to_s", RUBY_METHOD_FUNC(w_hash_inspect), 0);
1415
1820
  rb_define_method(rb_cUsaminHash, "keys", RUBY_METHOD_FUNC(w_hash_keys), 0);
1416
1821
  rb_define_method(rb_cUsaminHash, "length", RUBY_METHOD_FUNC(w_hash_length), 0);
1417
1822
  rb_define_method(rb_cUsaminHash, "size", RUBY_METHOD_FUNC(w_hash_length), 0);
@@ -1435,16 +1840,23 @@ extern "C" void Init_usamin(void) {
1435
1840
  rb_define_method(rb_cUsaminArray, "[]", RUBY_METHOD_FUNC(w_array_operator_indexer), -1);
1436
1841
  rb_define_method(rb_cUsaminArray, "at", RUBY_METHOD_FUNC(w_array_at), 1);
1437
1842
  rb_define_method(rb_cUsaminArray, "compact", RUBY_METHOD_FUNC(w_array_compact), 0);
1843
+ rb_define_method(rb_cUsaminArray, "dig", RUBY_METHOD_FUNC(w_array_dig), -1);
1438
1844
  rb_define_method(rb_cUsaminArray, "each", RUBY_METHOD_FUNC(w_array_each), 0);
1439
1845
  rb_define_method(rb_cUsaminArray, "each_index", RUBY_METHOD_FUNC(w_array_each_index), 0);
1440
1846
  rb_define_method(rb_cUsaminArray, "empty?", RUBY_METHOD_FUNC(w_array_isempty), 0);
1441
1847
  rb_define_method(rb_cUsaminArray, "fetch", RUBY_METHOD_FUNC(w_array_fetch), -1);
1442
1848
  rb_define_method(rb_cUsaminArray, "find_index", RUBY_METHOD_FUNC(w_array_find_index), -1);
1849
+ rb_define_method(rb_cUsaminArray, "flatten", RUBY_METHOD_FUNC(w_array_flatten), -1);
1443
1850
  rb_define_method(rb_cUsaminArray, "index", RUBY_METHOD_FUNC(w_array_index), -1);
1444
1851
  rb_define_method(rb_cUsaminArray, "first", RUBY_METHOD_FUNC(w_array_first), -1);
1445
1852
  rb_define_method(rb_cUsaminArray, "include?", RUBY_METHOD_FUNC(w_array_include), 1);
1853
+ rb_define_method(rb_cUsaminArray, "inspect", RUBY_METHOD_FUNC(w_array_inspect), 0);
1854
+ rb_define_method(rb_cUsaminArray, "to_s", RUBY_METHOD_FUNC(w_array_inspect), 0);
1446
1855
  rb_define_method(rb_cUsaminArray, "last", RUBY_METHOD_FUNC(w_array_last), -1);
1447
1856
  rb_define_method(rb_cUsaminArray, "length", RUBY_METHOD_FUNC(w_array_length), 0);
1857
+ rb_define_method(rb_cUsaminArray, "reverse", RUBY_METHOD_FUNC(w_array_reverse), 0);
1858
+ rb_define_method(rb_cUsaminArray, "rindex", RUBY_METHOD_FUNC(w_array_rindex), -1);
1859
+ rb_define_method(rb_cUsaminArray, "rotate", RUBY_METHOD_FUNC(w_array_rotate), -1);
1448
1860
  rb_define_method(rb_cUsaminArray, "size", RUBY_METHOD_FUNC(w_array_length), 0);
1449
1861
  rb_define_method(rb_cUsaminArray, "slice", RUBY_METHOD_FUNC(w_array_slice), -1);
1450
1862
  rb_define_method(rb_cUsaminArray, "to_ary", RUBY_METHOD_FUNC(w_array_eval), 0);
@@ -10,15 +10,29 @@ module JSON
10
10
  end
11
11
 
12
12
  def self.parse(source, **options)
13
- Usamin.parse(object)
13
+ Usamin.parse(source)
14
14
  end
15
15
 
16
16
  def self.load(source, proc = nil, **options)
17
- ret = Usamin.parse(object)
18
- proc.call(ret) if proc
17
+ ret = Usamin.parse(source)
18
+ LoadProcCaller.load_call_proc(ret, proc) if proc
19
19
  ret
20
20
  end
21
21
 
22
+ class LoadProcCaller
23
+ def self.load_call_proc(object, proc)
24
+ if object.is_a?(Array)
25
+ object.each{|e| load_call_proc(e, proc)}
26
+ elsif object.is_a?(Hash)
27
+ object.each do |k, v|
28
+ proc.call(k)
29
+ load_call_proc(v, proc)
30
+ end
31
+ end
32
+ proc.call(object)
33
+ end
34
+ end
35
+
22
36
  class << self
23
37
  alias fast_generate generate
24
38
  alias restore load
@@ -1,3 +1,3 @@
1
1
  module Usamin
2
- VERSION = "7.7.8"
2
+ VERSION = '7.7.9'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: usamin
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.7.8
4
+ version: 7.7.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ishotihadus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-12-25 00:00:00.000000000 Z
11
+ date: 2019-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -107,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
107
  - !ruby/object:Gem::Version
108
108
  version: '0'
109
109
  requirements: []
110
- rubygems_version: 3.0.1
110
+ rubygems_version: 3.0.3
111
111
  signing_key:
112
112
  specification_version: 4
113
113
  summary: A RapidJSON Wrapper for Ruby