ucl 0.1.2.1 → 0.1.3.2
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 +4 -4
- data/ext/extconf.rb +2 -1
- data/ext/ucl.c +91 -83
- data/ucl.gemspec +4 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d2c681a7a148565a2c6e3290750619dfbb43e8c7cea4b0caad20787a22c0f15
|
4
|
+
data.tar.gz: 2a15c402216b1d7549c93f295e958db3176bfb4455b15d8189885e6c4792f31a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b108e5921edbbdf48b232a7fb67a2dc65335c06ee709e74cbfd22ae1900c51ed6cc5ce61928035e0bf6c3e7ebea6dd9570412fc0cbab668caee0d04c61f72d5
|
7
|
+
data.tar.gz: bf43bcdb042f0e62e5e47d1bfacf7357de3c0262e8e6bda3a15249ba54d63018dc7ec80f0d2eca276088a6745285bb60c1b0b08d678786ecf3945340986bb854
|
data/ext/extconf.rb
CHANGED
data/ext/ucl.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#include <stdbool.h>
|
6
6
|
|
7
7
|
/* Fake flag */
|
8
|
-
#define UCL_PARSER_KEY_SYMBOL (1 <<
|
8
|
+
#define UCL_PARSER_KEY_SYMBOL (1 << 12)
|
9
9
|
|
10
10
|
|
11
11
|
/**
|
@@ -25,87 +25,83 @@
|
|
25
25
|
static VALUE mUCL = Qundef;
|
26
26
|
static VALUE eUCLError = Qundef;
|
27
27
|
|
28
|
-
static int
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
static int ucl_allowed_c_flags = UCL_PARSER_KEY_LOWERCASE |
|
29
|
+
UCL_PARSER_NO_TIME |
|
30
|
+
UCL_PARSER_DISABLE_MACRO |
|
31
|
+
UCL_PARSER_NO_FILEVARS ;
|
32
|
+
|
32
33
|
|
33
34
|
|
34
35
|
VALUE
|
35
|
-
_iterate_valid_ucl(ucl_object_t const *root, int flags)
|
36
|
+
_iterate_valid_ucl(ucl_object_t const *root, int flags, bool *failed)
|
36
37
|
{
|
37
|
-
|
38
|
-
|
39
|
-
const ucl_object_t *cur;
|
40
|
-
ucl_object_iter_t it_obj = NULL;
|
38
|
+
ucl_object_iter_t it = ucl_object_iterate_new(NULL);
|
39
|
+
const ucl_object_t *obj = NULL;
|
41
40
|
|
42
|
-
VALUE
|
43
|
-
|
44
|
-
while ((obj = ucl_iterate_object (root, &it, false))) {
|
45
|
-
VALUE val;
|
46
|
-
|
47
|
-
switch (obj->type) {
|
48
|
-
case UCL_INT:
|
49
|
-
val = rb_ll2inum((long long)ucl_object_toint(obj));
|
50
|
-
break;
|
51
|
-
|
52
|
-
case UCL_FLOAT:
|
53
|
-
val = rb_float_new(ucl_object_todouble(obj));
|
54
|
-
break;
|
55
|
-
|
56
|
-
case UCL_STRING:
|
57
|
-
val = rb_str_new_cstr(ucl_object_tostring(obj));
|
58
|
-
break;
|
59
|
-
|
60
|
-
case UCL_BOOLEAN:
|
61
|
-
val = ucl_object_toboolean(obj) ? Qtrue : Qfalse;
|
62
|
-
break;
|
63
|
-
|
64
|
-
case UCL_TIME:
|
65
|
-
val = rb_float_new(ucl_object_todouble(obj));
|
66
|
-
break;
|
67
|
-
|
68
|
-
case UCL_OBJECT:
|
69
|
-
it_obj = NULL;
|
70
|
-
val = rb_hash_new();
|
71
|
-
while ((cur = ucl_iterate_object(obj, &it_obj, true))) {
|
72
|
-
const char *obj_key = ucl_object_key(cur);
|
73
|
-
VALUE key = (flags & UCL_PARSER_KEY_SYMBOL)
|
74
|
-
? rb_id2sym(rb_intern(obj_key))
|
75
|
-
: rb_str_new_cstr(obj_key);
|
76
|
-
rb_hash_aset(val, key, _iterate_valid_ucl(cur, flags));
|
77
|
-
}
|
78
|
-
break;
|
79
|
-
|
80
|
-
case UCL_ARRAY:
|
81
|
-
it_obj = NULL;
|
82
|
-
val = rb_ary_new();
|
83
|
-
while ((cur = ucl_iterate_object (obj, &it_obj, true))) {
|
84
|
-
rb_ary_push(val, _iterate_valid_ucl(cur, flags));
|
85
|
-
}
|
86
|
-
break;
|
87
|
-
|
88
|
-
case UCL_USERDATA:
|
89
|
-
val = rb_str_new(obj->value.sv, obj->len);
|
90
|
-
break;
|
91
|
-
|
92
|
-
case UCL_NULL:
|
93
|
-
val = Qnil;
|
94
|
-
break;
|
95
|
-
|
96
|
-
default:
|
97
|
-
rb_bug("unhandled type (%d)", obj->type);
|
98
|
-
|
99
|
-
}
|
100
|
-
rb_ary_push(lst, val);
|
41
|
+
VALUE val;
|
101
42
|
|
43
|
+
switch (root->type) {
|
44
|
+
case UCL_INT:
|
45
|
+
val = rb_ll2inum((long long)ucl_object_toint(root));
|
46
|
+
break;
|
47
|
+
|
48
|
+
case UCL_FLOAT:
|
49
|
+
val = rb_float_new(ucl_object_todouble(root));
|
50
|
+
break;
|
51
|
+
|
52
|
+
case UCL_STRING: {
|
53
|
+
size_t len;
|
54
|
+
const char *str = ucl_object_tolstring(root, &len);
|
55
|
+
val = rb_str_new(str, len);
|
56
|
+
break;
|
102
57
|
}
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
58
|
+
|
59
|
+
case UCL_BOOLEAN:
|
60
|
+
val = ucl_object_toboolean(root) ? Qtrue : Qfalse;
|
61
|
+
break;
|
62
|
+
|
63
|
+
case UCL_TIME:
|
64
|
+
val = rb_float_new(ucl_object_todouble(root));
|
65
|
+
break;
|
66
|
+
|
67
|
+
case UCL_OBJECT:
|
68
|
+
val = rb_hash_new();
|
69
|
+
it = ucl_object_iterate_reset(it, root);
|
70
|
+
while ((obj = ucl_object_iterate_safe(it, !true))) {
|
71
|
+
size_t keylen;
|
72
|
+
const char *key = ucl_object_keyl(obj, &keylen);
|
73
|
+
VALUE v_key = rb_str_new(key, keylen);
|
74
|
+
if (flags & UCL_PARSER_KEY_SYMBOL)
|
75
|
+
v_key = rb_to_symbol(v_key);
|
76
|
+
rb_hash_aset(val, v_key, _iterate_valid_ucl(obj, flags, failed));
|
77
|
+
}
|
78
|
+
*failed = ucl_object_iter_chk_excpn(it);
|
79
|
+
break;
|
80
|
+
|
81
|
+
case UCL_ARRAY:
|
82
|
+
val = rb_ary_new();
|
83
|
+
it = ucl_object_iterate_reset(it, root);
|
84
|
+
while ((obj = ucl_object_iterate_safe(it, !true))) {
|
85
|
+
rb_ary_push(val, _iterate_valid_ucl(obj, flags, failed));
|
86
|
+
}
|
87
|
+
*failed = ucl_object_iter_chk_excpn(it);
|
88
|
+
break;
|
89
|
+
|
90
|
+
case UCL_USERDATA:
|
91
|
+
val = rb_str_new(root->value.sv, root->len);
|
92
|
+
break;
|
93
|
+
|
94
|
+
case UCL_NULL:
|
95
|
+
val = Qnil;
|
96
|
+
break;
|
97
|
+
|
98
|
+
default:
|
99
|
+
rb_bug("unhandled type (%d)", root->type);
|
100
|
+
|
108
101
|
}
|
102
|
+
|
103
|
+
ucl_object_iterate_free(it);
|
104
|
+
return val;
|
109
105
|
}
|
110
106
|
|
111
107
|
static VALUE
|
@@ -142,7 +138,7 @@ ucl_s_parse(int argc, VALUE *argv, VALUE klass)
|
|
142
138
|
rb_check_type(data, T_STRING);
|
143
139
|
rb_check_type(flags, T_FIXNUM);
|
144
140
|
|
145
|
-
int c_flags = FIX2INT(flags) &
|
141
|
+
int c_flags = FIX2INT(flags) & ucl_allowed_c_flags;
|
146
142
|
|
147
143
|
struct ucl_parser *parser =
|
148
144
|
ucl_parser_new(c_flags | UCL_PARSER_NO_IMPLICIT_ARRAYS);
|
@@ -157,12 +153,17 @@ ucl_s_parse(int argc, VALUE *argv, VALUE klass)
|
|
157
153
|
rb_raise(eUCLError, "%s", errormsg);
|
158
154
|
}
|
159
155
|
|
160
|
-
|
161
|
-
|
156
|
+
bool failed = false;
|
157
|
+
ucl_object_t *root = ucl_parser_get_object(parser);
|
158
|
+
VALUE res = _iterate_valid_ucl(root, FIX2INT(flags), &failed);
|
162
159
|
|
163
160
|
if (parser != NULL) { ucl_parser_free(parser); }
|
164
161
|
if (root != NULL) { ucl_object_unref(root); }
|
165
|
-
|
162
|
+
|
163
|
+
if (failed) {
|
164
|
+
rb_raise(eUCLError, "failed to iterate over ucl object");
|
165
|
+
}
|
166
|
+
|
166
167
|
return res;
|
167
168
|
}
|
168
169
|
|
@@ -188,25 +189,32 @@ ucl_s_load_file(int argc, VALUE *argv, VALUE klass)
|
|
188
189
|
rb_check_type(file, T_STRING);
|
189
190
|
rb_check_type(flags, T_FIXNUM);
|
190
191
|
|
191
|
-
int c_flags = FIX2INT(flags) &
|
192
|
+
int c_flags = FIX2INT(flags) & ucl_allowed_c_flags;
|
192
193
|
char *c_file = StringValueCStr(file);
|
193
|
-
|
194
|
+
|
194
195
|
struct ucl_parser *parser =
|
195
196
|
ucl_parser_new(c_flags | UCL_PARSER_NO_IMPLICIT_ARRAYS);
|
197
|
+
|
196
198
|
ucl_parser_add_file(parser, c_file);
|
197
|
-
|
199
|
+
ucl_parser_set_filevars(parser, c_file, false);
|
200
|
+
|
198
201
|
if (ucl_parser_get_error(parser)) {
|
199
202
|
const char *errormsg = ucl_parser_get_error(parser);
|
200
203
|
if (parser != NULL) { ucl_parser_free(parser); }
|
201
204
|
rb_raise(eUCLError, "%s", errormsg);
|
202
205
|
}
|
203
206
|
|
204
|
-
|
205
|
-
|
207
|
+
bool failed = false;
|
208
|
+
ucl_object_t *root = ucl_parser_get_object(parser);
|
209
|
+
VALUE res = _iterate_valid_ucl(root, FIX2INT(flags), &failed);
|
206
210
|
|
207
211
|
if (parser != NULL) { ucl_parser_free(parser); }
|
208
212
|
if (root != NULL) { ucl_object_unref(root); }
|
209
213
|
|
214
|
+
if (failed) {
|
215
|
+
rb_raise(eUCLError, "failed to iterate over ucl object");
|
216
|
+
}
|
217
|
+
|
210
218
|
return res;
|
211
219
|
}
|
212
220
|
|
data/ucl.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'ucl'
|
3
|
-
s.version = '0.1.2
|
3
|
+
s.version = '0.1.3.2'
|
4
4
|
s.summary = " Universal configuration library parser"
|
5
5
|
s.description = <<~EOF
|
6
6
|
|
@@ -11,9 +11,9 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.homepage = 'https://github.com/sdalu/ruby-ucl'
|
12
12
|
s.license = 'MIT'
|
13
13
|
|
14
|
-
s.authors = [ "Stéphane D'Alu"
|
14
|
+
s.authors = [ "Stéphane D'Alu" ]
|
15
15
|
s.email = [ 'sdalu@sdalu.com' ]
|
16
16
|
|
17
|
-
s.extensions
|
18
|
-
s.files
|
17
|
+
s.extensions = [ 'ext/extconf.rb' ]
|
18
|
+
s.files = %w[ ucl.gemspec ] + Dir['ext/**/*.{c,h,rb}']
|
19
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ucl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.2
|
4
|
+
version: 0.1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stéphane D'Alu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2+
|
14
14
|
|
@@ -43,7 +43,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: '0'
|
45
45
|
requirements: []
|
46
|
-
rubygems_version: 3.
|
46
|
+
rubygems_version: 3.5.19
|
47
47
|
signing_key:
|
48
48
|
specification_version: 4
|
49
49
|
summary: Universal configuration library parser
|