nyara 0.1.pre.0 → 0.1.pre.1
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/bin/nyara +2 -14
- data/changes +3 -0
- data/example/factorial.rb +19 -0
- data/example/hello.rb +5 -0
- data/example/project.rb +11 -0
- data/example/stream.rb +14 -0
- data/ext/extconf.rb +19 -0
- data/ext/hashes.c +160 -57
- data/ext/inc/ary_intern.h +36 -0
- data/ext/route.cc +2 -1
- data/ext/url_encoded.c +1 -0
- data/lib/nyara.rb +1 -0
- data/lib/nyara/command.rb +60 -79
- data/lib/nyara/config.rb +19 -1
- data/lib/nyara/controller.rb +64 -7
- data/lib/nyara/hashes/config_hash.rb +3 -20
- data/lib/nyara/hashes/header_hash.rb +2 -2
- data/lib/nyara/hashes/param_hash.rb +1 -0
- data/lib/nyara/nyara.rb +45 -37
- data/lib/nyara/part.rb +2 -2
- data/lib/nyara/reload.rb +63 -64
- data/lib/nyara/route.rb +7 -6
- data/lib/nyara/session.rb +4 -0
- data/lib/nyara/templates/{Gemfile → Gemfile.tt} +4 -0
- data/lib/nyara/templates/Linnerfile +28 -0
- data/lib/nyara/templates/Rakefile +16 -2
- data/lib/nyara/templates/app/assets/files/favicon.ico +1 -0
- data/lib/nyara/templates/app/assets/files/robots.txt +5 -0
- data/lib/nyara/templates/app/assets/scripts/app.coffee +4 -0
- data/lib/nyara/templates/app/assets/scripts/module-example.coffee +4 -0
- data/lib/nyara/templates/app/assets/styles/app.scss +2 -0
- data/lib/nyara/templates/app/controllers/application_controller.rb +8 -0
- data/lib/nyara/templates/app/views/layouts/application.erb.tt +12 -0
- data/lib/nyara/templates/config/application.rb +4 -0
- data/lib/nyara/templates/config/{database.yml → database.yml.tt} +3 -3
- data/lib/nyara/templates/config/production.rb +2 -0
- data/lib/nyara/view.rb +6 -2
- data/nyara.gemspec +3 -1
- data/rakefile +7 -26
- data/spec/apps/reload.rb +35 -0
- data/spec/command_spec.rb +24 -10
- data/spec/config_spec.rb +19 -8
- data/spec/controller_spec.rb +14 -0
- data/spec/evented_io_spec.rb +3 -1
- data/spec/ext_route_spec.rb +25 -3
- data/spec/hashes_spec.rb +45 -21
- data/spec/integration_spec.rb +28 -2
- data/spec/path_helper_spec.rb +7 -0
- data/spec/performance_spec.rb +1 -1
- data/spec/public/test.css +1 -0
- data/{lib/nyara/templates/public/robot.txt → spec/public/test.jpg} +0 -0
- data/spec/public/test.js +1 -0
- data/spec/reload_spec.rb +50 -0
- data/spec/route_spec.rb +4 -4
- data/spec/spec_helper.rb +15 -9
- data/spec/url_encoded_spec.rb +5 -0
- data/spec/view_spec.rb +7 -0
- data/spec/views/_partial.slim +1 -1
- data/tools/bug.rb +53 -0
- data/tools/hello.rb +49 -0
- data/tools/memcheck.rb +33 -0
- metadata +73 -41
- data/ext/inc/status_codes.inc +0 -64
- data/lib/nyara/templates/app/views/layouts/application.erb +0 -12
- data/lib/nyara/templates/public/css/app.css +0 -1
- data/lib/nyara/templates/public/js/app.js +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8806d56e981db23403ba6662c31af80629c2afd
|
4
|
+
data.tar.gz: 98d333128c7785a3b32e49ffbf4c7cc16f570c16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79b6568857f0ef7fb6e5bd3d2286f68777554536e4223e592e48cface08b0754c3c4b725a7b52838617f48d1ee969c1aa412e3a3eae0710d5f1ef0d488ed3b7c
|
7
|
+
data.tar.gz: 5790f2a3e825c6eec82c0befab9a9e596894e71996ae922c63ca3bac48a5e1c0caf818cfd5f2a0cbc7347f6eff934ad36139e2ca8d4fd3b4687cd829308977a3
|
data/bin/nyara
CHANGED
@@ -1,17 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require_relative "../lib/nyara/nyara"
|
3
|
+
require_relative "../lib/nyara/command"
|
3
4
|
|
4
|
-
|
5
|
-
task_name = args.shift || 'help'
|
6
|
-
|
7
|
-
|
8
|
-
case task_name
|
9
|
-
when 'help', '-h'
|
10
|
-
Nyara::Command.help
|
11
|
-
when '-v'
|
12
|
-
Nyara::Command.version
|
13
|
-
when 'new'
|
14
|
-
Nyara::Command.new_project(*args)
|
15
|
-
when 's','server'
|
16
|
-
Nyara::Command.run_server(*args)
|
17
|
-
end
|
5
|
+
Nyara::Command.start
|
data/changes
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
2013-08-17 integrate with linner
|
2
|
+
2013-08-16 use thor for `nyara` commands
|
3
|
+
2013-08-15 (developers) migrated to git subtree, you don't need to hand-update submodules anymore
|
1
4
|
2013-07-18 add automatic reloader for development mode
|
2
5
|
2013-07-13 add bin script `nyara`
|
3
6
|
2013-07-10 add before filter
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'nyara'
|
2
|
+
|
3
|
+
get '/factorial(%u)' do |n|
|
4
|
+
redirect_to '#product', 1, n
|
5
|
+
end
|
6
|
+
|
7
|
+
meta '#product'
|
8
|
+
get '/%u*factorial(%u)' do |product, n|
|
9
|
+
if n == 0
|
10
|
+
redirect_to '#result', product
|
11
|
+
else
|
12
|
+
redirect_to '#product', product * n, n - 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
meta '#result'
|
17
|
+
get '/%u' do |result|
|
18
|
+
send_string result
|
19
|
+
end
|
data/example/hello.rb
ADDED
data/example/project.rb
ADDED
data/example/stream.rb
ADDED
data/ext/extconf.rb
CHANGED
@@ -1,5 +1,23 @@
|
|
1
|
+
Dir.chdir __dir__
|
1
2
|
require "mkmf"
|
2
3
|
|
4
|
+
def generate_version_file
|
5
|
+
version_file = 'inc/version.inc'
|
6
|
+
puts "generating: #{version_file}"
|
7
|
+
lines = File.readlines('../nyara.gemspec')
|
8
|
+
version = nil
|
9
|
+
lines.each do |line|
|
10
|
+
if line =~ /s\.version =/
|
11
|
+
version = line[/\d+(\.\d+)*(\.pre\.\d+)?/]
|
12
|
+
break
|
13
|
+
end
|
14
|
+
end
|
15
|
+
abort 'version not found' unless version
|
16
|
+
File.open version_file, 'w' do |f|
|
17
|
+
f.puts %Q{#define NYARA_VERSION "#{version}"}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
3
21
|
def tweak_include
|
4
22
|
dir = File.dirname __FILE__
|
5
23
|
multipart_dir = File.join dir, "multipart-parser-c"
|
@@ -35,4 +53,5 @@ have_func('rb_ary_new_capa', 'ruby.h')
|
|
35
53
|
|
36
54
|
tweak_include
|
37
55
|
tweak_cflags
|
56
|
+
generate_version_file
|
38
57
|
create_makefile 'nyara'
|
data/ext/hashes.c
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
#include "nyara.h"
|
4
4
|
#include <ruby/st.h>
|
5
|
+
#include <assert.h>
|
5
6
|
#include "inc/str_intern.h"
|
7
|
+
#include "inc/ary_intern.h"
|
6
8
|
#include <ctype.h>
|
7
9
|
|
8
10
|
VALUE nyara_param_hash_class;
|
@@ -42,29 +44,26 @@ static VALUE param_hash_aset(VALUE self, VALUE key, VALUE value) {
|
|
42
44
|
return rb_hash_aset(self, key, value);
|
43
45
|
}
|
44
46
|
|
45
|
-
//
|
46
|
-
//
|
47
|
-
static VALUE
|
48
|
-
Check_Type(name, T_STRING);
|
47
|
+
// replace content of keys with split name
|
48
|
+
// existing prefices are not replaced for minimal allocation
|
49
|
+
static VALUE _split_name(volatile VALUE name) {
|
49
50
|
long len = RSTRING_LEN(name);
|
50
51
|
if (len == 0) {
|
51
52
|
rb_raise(rb_eArgError, "name should not be empty");
|
52
53
|
}
|
53
54
|
char* s = RSTRING_PTR(name);
|
54
55
|
|
55
|
-
// NOTE it's OK to compare utf-8 string with ascii chars, because utf-8 code units are either:
|
56
|
-
// - byte with 0 in highest nibble, which is ascii char
|
57
|
-
// - bytes with 1 in highest nibble, which can not be eql to any ascii char
|
58
|
-
|
59
56
|
volatile VALUE keys = rb_ary_new();
|
57
|
+
# define INSERT(s, len) \
|
58
|
+
rb_ary_push(keys, rb_enc_str_new(s, len, u8_encoding))
|
59
|
+
|
60
60
|
long i;
|
61
61
|
for (i = 0; i < len; i++) {
|
62
62
|
if (s[i] == '[') {
|
63
63
|
if (i == 0) {
|
64
64
|
rb_raise(rb_eArgError, "bad name (starts with '[')");
|
65
65
|
}
|
66
|
-
|
67
|
-
rb_ary_push(keys, key);
|
66
|
+
INSERT(s, i);
|
68
67
|
i++;
|
69
68
|
break;
|
70
69
|
} else if (s[i] == ']') {
|
@@ -80,8 +79,7 @@ static VALUE param_hash_split_name(VALUE _, VALUE name) {
|
|
80
79
|
for (long j = last_j; j < len; j++) {
|
81
80
|
if (s[j] == ']') {
|
82
81
|
if (j == len - 1 || s[j + 1] == '[') {
|
83
|
-
|
84
|
-
rb_ary_push(keys, key);
|
82
|
+
INSERT(s + last_j, j - last_j);
|
85
83
|
last_j = j + 2; // fine for last round
|
86
84
|
j++;
|
87
85
|
} else {
|
@@ -95,70 +93,155 @@ static VALUE param_hash_split_name(VALUE _, VALUE name) {
|
|
95
93
|
// single key
|
96
94
|
rb_ary_push(keys, name);
|
97
95
|
}
|
96
|
+
# undef INSERT
|
98
97
|
return keys;
|
99
98
|
}
|
100
99
|
|
101
|
-
//
|
102
|
-
//
|
103
|
-
|
104
|
-
|
105
|
-
|
100
|
+
// prereq: name should be already url decoded <br>
|
101
|
+
// "a[b][][c]" ==> ["a", "b", "", "c"]
|
102
|
+
static VALUE param_hash_split_name(VALUE _, VALUE name) {
|
103
|
+
Check_Type(name, T_STRING);
|
104
|
+
return _split_name(name);
|
105
|
+
}
|
106
|
+
|
107
|
+
// prereq: all elements in keys are string
|
108
|
+
static VALUE param_hash_nested_aref(volatile VALUE obj, VALUE keys) {
|
106
109
|
Check_Type(keys, T_ARRAY);
|
107
|
-
VALUE*
|
108
|
-
long
|
109
|
-
|
110
|
-
|
111
|
-
|
110
|
+
VALUE* keys_ptr = RARRAY_PTR(keys);
|
111
|
+
long keys_len = RARRAY_LEN(keys);
|
112
|
+
|
113
|
+
for (long i = 0; i < keys_len; i++) {
|
114
|
+
volatile VALUE key = keys_ptr[i];
|
115
|
+
if (RSTRING_LEN(key)) {
|
116
|
+
if (rb_obj_is_kind_of(obj, rb_cHash)) {
|
117
|
+
obj = rb_hash_aref(obj, key);
|
118
|
+
} else {
|
119
|
+
return Qnil;
|
120
|
+
}
|
121
|
+
} else {
|
122
|
+
if (rb_obj_is_kind_of(obj, rb_cArray)) {
|
123
|
+
long arr_len = RARRAY_LEN(obj);
|
124
|
+
if (arr_len) {
|
125
|
+
obj = RARRAY_PTR(obj)[arr_len - 1];
|
126
|
+
} else {
|
127
|
+
return Qnil;
|
128
|
+
}
|
129
|
+
} else {
|
130
|
+
return Qnil;
|
131
|
+
}
|
132
|
+
}
|
112
133
|
}
|
134
|
+
return obj;
|
135
|
+
}
|
136
|
+
|
137
|
+
// prereq: len > 0
|
138
|
+
static void _nested_aset(VALUE output, volatile VALUE keys, VALUE value) {
|
113
139
|
volatile VALUE klass = rb_obj_class(output);
|
140
|
+
VALUE* arr = RARRAY_PTR(keys);
|
141
|
+
long len = RARRAY_LEN(keys);
|
114
142
|
|
115
143
|
// first key seg
|
116
|
-
|
144
|
+
if (!RSTRING_LEN(arr[0])) {
|
145
|
+
rb_raise(rb_eRuntimeError, "array key at:0 conflicts with hash");
|
146
|
+
}
|
147
|
+
bool is_hash_key = true;
|
148
|
+
|
149
|
+
# define NEW_CHILD(child) \
|
150
|
+
volatile VALUE child = (next_is_hash_key ? rb_class_new_instance(0, NULL, klass) : rb_ary_new());
|
151
|
+
# define ASSERT_HASH \
|
152
|
+
if (TYPE(output) != T_HASH) {\
|
153
|
+
rb_raise(rb_eTypeError, "hash key at:%ld conflicts with array", i + 1);\
|
154
|
+
}
|
155
|
+
# define ASSERT_ARRAY \
|
156
|
+
if (TYPE(output) != T_ARRAY) {\
|
157
|
+
rb_raise(rb_eTypeError, "array key at:%ld conflicts with hash", i + 1);\
|
158
|
+
}
|
159
|
+
# define CHECK_NEXT \
|
160
|
+
if (next_is_hash_key) {\
|
161
|
+
ASSERT_HASH;\
|
162
|
+
} else {\
|
163
|
+
ASSERT_ARRAY;\
|
164
|
+
}
|
165
|
+
|
166
|
+
// special treatment to array keys according to last 2 segments:
|
167
|
+
// *[][foo] append new hash if already exists
|
168
|
+
//
|
169
|
+
// normal cases:
|
170
|
+
// *[] just push
|
171
|
+
// *[foo] find last elem first
|
172
|
+
// *[]* find last elem first
|
117
173
|
|
118
174
|
// middle key segs
|
119
175
|
for (long i = 0; i < len - 1; i++) {
|
120
|
-
|
121
|
-
# define NEW_CHILD(child) \
|
122
|
-
volatile VALUE child = (next_is_hash_key ? rb_class_new_instance(0, NULL, klass) : rb_ary_new());
|
123
|
-
|
176
|
+
bool next_is_hash_key = RSTRING_LEN(arr[i + 1]);
|
124
177
|
if (is_hash_key) {
|
125
178
|
if (nyara_rb_hash_has_key(output, arr[i])) {
|
126
179
|
output = rb_hash_aref(output, arr[i]);
|
127
|
-
|
128
|
-
|
129
|
-
|
180
|
+
CHECK_NEXT;
|
181
|
+
} else {
|
182
|
+
NEW_CHILD(child);
|
183
|
+
rb_hash_aset(output, arr[i], child);
|
184
|
+
output = child;
|
185
|
+
}
|
186
|
+
} else {
|
187
|
+
// array key, try to use the last elem
|
188
|
+
long output_len = RARRAY_LEN(output);
|
189
|
+
if (output_len) {
|
190
|
+
bool append = false;
|
191
|
+
if (i == len - 2 && next_is_hash_key) {
|
192
|
+
volatile VALUE next_hash = RARRAY_PTR(output)[output_len - 1];
|
193
|
+
if (nyara_rb_hash_has_key(next_hash, arr[i + 1])) {
|
194
|
+
append = true;
|
130
195
|
}
|
196
|
+
}
|
197
|
+
if (append) {
|
198
|
+
volatile VALUE child = rb_class_new_instance(0, NULL, klass);
|
199
|
+
rb_ary_push(output, child);
|
200
|
+
output = child;
|
131
201
|
} else {
|
132
|
-
|
133
|
-
|
134
|
-
}
|
202
|
+
output = RARRAY_PTR(output)[output_len - 1];
|
203
|
+
CHECK_NEXT;
|
135
204
|
}
|
136
205
|
} else {
|
137
206
|
NEW_CHILD(child);
|
138
|
-
|
207
|
+
rb_ary_push(output, child);
|
139
208
|
output = child;
|
140
209
|
}
|
141
|
-
} else {
|
142
|
-
NEW_CHILD(child);
|
143
|
-
rb_ary_push(output, child);
|
144
|
-
output = child;
|
145
210
|
}
|
146
211
|
is_hash_key = next_is_hash_key;
|
147
|
-
# undef NEW_CHILD
|
148
212
|
}
|
149
213
|
|
150
|
-
|
214
|
+
# undef CHECK_NEXT
|
215
|
+
# undef ASSERT_ARRAY
|
216
|
+
# undef ASSERT_HASH
|
217
|
+
# undef NEW_CHILD
|
218
|
+
|
219
|
+
// terminate seg
|
151
220
|
if (is_hash_key) {
|
152
221
|
rb_hash_aset(output, arr[len - 1], value);
|
153
222
|
} else {
|
154
223
|
rb_ary_push(output, value);
|
155
224
|
}
|
225
|
+
}
|
226
|
+
|
227
|
+
// prereq: all elements in keys are string
|
228
|
+
// assume keys = [a, b, c] ==> self[a][b][c] = value
|
229
|
+
// blank keys will be translated as array keys.
|
230
|
+
// created hashes has the same class with output
|
231
|
+
static VALUE param_hash_nested_aset(VALUE output, VALUE keys, VALUE value) {
|
232
|
+
Check_Type(keys, T_ARRAY);
|
233
|
+
long len = RARRAY_LEN(keys);
|
234
|
+
if (!len) {
|
235
|
+
rb_raise(rb_eArgError, "aset 0 length key");
|
236
|
+
return Qnil;
|
237
|
+
}
|
238
|
+
_nested_aset(output, keys, value);
|
156
239
|
return output;
|
157
240
|
}
|
158
241
|
|
159
242
|
// s, len is the raw kv string
|
160
243
|
// returns trailing length
|
161
|
-
static void
|
244
|
+
static void _cookie_kv(VALUE output, const char* s, long len) {
|
162
245
|
// strip
|
163
246
|
for (; len > 0; len--, s++) {
|
164
247
|
if (!isspace(*s)) {
|
@@ -174,12 +257,7 @@ static void _kv(VALUE output, const char* s, long len, bool nested_mode) {
|
|
174
257
|
volatile VALUE key = rb_enc_str_new("", 0, u8_encoding);
|
175
258
|
volatile VALUE value = rb_enc_str_new("", 0, u8_encoding);
|
176
259
|
nyara_decode_uri_kv(key, value, s, len);
|
177
|
-
|
178
|
-
volatile VALUE keys = param_hash_split_name(Qnil, key);
|
179
|
-
param_hash_nested_aset(output, keys, value);
|
180
|
-
} else {
|
181
|
-
rb_hash_aset(output, key, value);
|
182
|
-
}
|
260
|
+
rb_hash_aset(output, key, value);
|
183
261
|
}
|
184
262
|
}
|
185
263
|
|
@@ -201,17 +279,41 @@ static VALUE param_hash_parse_cookie(VALUE _, VALUE output, VALUE str) {
|
|
201
279
|
for (; i >= 0; i--) {
|
202
280
|
if (s[i] == ',' || s[i] == ';') {
|
203
281
|
if (i < last_i) {
|
204
|
-
|
282
|
+
_cookie_kv(output, s + i + 1, last_i - i);
|
205
283
|
}
|
206
284
|
last_i = i - 1;
|
207
285
|
}
|
208
286
|
}
|
209
287
|
if (last_i > 0) {
|
210
|
-
|
288
|
+
_cookie_kv(output, s, last_i + 1);
|
211
289
|
}
|
212
290
|
return output;
|
213
291
|
}
|
214
292
|
|
293
|
+
// s, len is the raw kv string
|
294
|
+
// returns trailing length
|
295
|
+
static void _param_kv(VALUE output, const char* s, long len) {
|
296
|
+
// strip
|
297
|
+
for (; len > 0; len--, s++) {
|
298
|
+
if (!isspace(*s)) {
|
299
|
+
break;
|
300
|
+
}
|
301
|
+
}
|
302
|
+
for (; len > 0; len--) {
|
303
|
+
if (!isspace(s[len - 1])) {
|
304
|
+
break;
|
305
|
+
}
|
306
|
+
}
|
307
|
+
if (len <= 0) {
|
308
|
+
return;
|
309
|
+
}
|
310
|
+
|
311
|
+
volatile VALUE name = rb_enc_str_new("", 0, u8_encoding);
|
312
|
+
volatile VALUE value = rb_enc_str_new("", 0, u8_encoding);
|
313
|
+
nyara_decode_uri_kv(name, value, s, len);
|
314
|
+
_nested_aset(output, _split_name(name), value);
|
315
|
+
}
|
316
|
+
|
215
317
|
// class method:
|
216
318
|
// insert parsing result into output
|
217
319
|
static VALUE param_hash_parse_param(VALUE _, VALUE output, VALUE str) {
|
@@ -229,13 +331,13 @@ static VALUE param_hash_parse_param(VALUE _, VALUE output, VALUE str) {
|
|
229
331
|
for (; i < len; i++) {
|
230
332
|
if (s[i] == '&' || s[i] == ';') {
|
231
333
|
if (i > last_i) {
|
232
|
-
|
334
|
+
_param_kv(output, s + last_i, i - last_i);
|
233
335
|
}
|
234
336
|
last_i = i + 1;
|
235
337
|
}
|
236
338
|
}
|
237
339
|
if (i > last_i) {
|
238
|
-
|
340
|
+
_param_kv(output, s + last_i, i - last_i);
|
239
341
|
}
|
240
342
|
return output;
|
241
343
|
}
|
@@ -308,7 +410,7 @@ static VALUE header_hash_aset(VALUE self, VALUE key, VALUE value) {
|
|
308
410
|
return rb_hash_aset(self, key, value);
|
309
411
|
}
|
310
412
|
|
311
|
-
static int
|
413
|
+
static int _reverse_merge_func(VALUE k, VALUE v, VALUE self_st) {
|
312
414
|
st_table* t = (st_table*)self_st;
|
313
415
|
if (!st_is_member(t, k)) {
|
314
416
|
st_insert(t, (st_data_t)k, (st_data_t)v);
|
@@ -321,11 +423,11 @@ static VALUE header_hash_reverse_merge_bang(VALUE self, VALUE other) {
|
|
321
423
|
rb_raise(rb_eArgError, "need a Nyara::HeaderHash");
|
322
424
|
}
|
323
425
|
st_table* t = rb_hash_tbl(self);
|
324
|
-
rb_hash_foreach(other,
|
426
|
+
rb_hash_foreach(other, _reverse_merge_func, (VALUE)t);
|
325
427
|
return self;
|
326
428
|
}
|
327
429
|
|
328
|
-
static int
|
430
|
+
static int _serialize_func(VALUE k, VALUE v, VALUE arr) {
|
329
431
|
long vlen = RSTRING_LEN(v);
|
330
432
|
// deleted field
|
331
433
|
if (vlen == 0) {
|
@@ -349,7 +451,7 @@ static VALUE header_hash_serialize(VALUE self) {
|
|
349
451
|
# else
|
350
452
|
volatile VALUE arr = rb_ary_new();
|
351
453
|
# endif
|
352
|
-
rb_hash_foreach(self,
|
454
|
+
rb_hash_foreach(self, _serialize_func, arr);
|
353
455
|
return arr;
|
354
456
|
}
|
355
457
|
|
@@ -364,6 +466,7 @@ void Init_hashes(VALUE nyara) {
|
|
364
466
|
rb_define_method(nyara_param_hash_class, "key?", param_hash_key_p, 1);
|
365
467
|
rb_define_method(nyara_param_hash_class, "[]=", param_hash_aset, 2);
|
366
468
|
rb_define_method(nyara_param_hash_class, "nested_aset", param_hash_nested_aset, 2);
|
469
|
+
rb_define_method(nyara_param_hash_class, "nested_aref", param_hash_nested_aref, 1);
|
367
470
|
rb_define_singleton_method(nyara_param_hash_class, "split_name", param_hash_split_name, 1);
|
368
471
|
rb_define_singleton_method(nyara_param_hash_class, "parse_param", param_hash_parse_param, 2);
|
369
472
|
rb_define_singleton_method(nyara_param_hash_class, "parse_cookie", param_hash_parse_cookie, 2);
|
@@ -375,6 +478,6 @@ void Init_hashes(VALUE nyara) {
|
|
375
478
|
rb_define_method(nyara_header_hash_class, "serialize", header_hash_serialize, 0);
|
376
479
|
|
377
480
|
// for internal use
|
378
|
-
rb_define_method(
|
379
|
-
rb_define_method(
|
481
|
+
rb_define_method(nyara_param_hash_class, "_aset", rb_hash_aset, 2);
|
482
|
+
rb_define_method(nyara_param_hash_class, "_aref", rb_hash_aref, 1);
|
380
483
|
}
|