fizx-ordered_json 0.3.1 → 0.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.
- data/.gitignore +29 -0
- data/CHANGELOG +22 -0
- data/README +4 -0
- data/Rakefile +35 -0
- data/ext/Makefile +149 -0
- data/ext/json-c-0.8/AUTHORS +2 -0
- data/ext/json-c-0.8/COPYING +19 -0
- data/ext/json-c-0.8/ChangeLog +73 -0
- data/ext/json-c-0.8/INSTALL +229 -0
- data/ext/json-c-0.8/Makefile.am +43 -0
- data/ext/json-c-0.8/Makefile.in +734 -0
- data/ext/json-c-0.8/NEWS +1 -0
- data/ext/json-c-0.8/README +20 -0
- data/ext/json-c-0.8/aclocal.m4 +8794 -0
- data/ext/json-c-0.8/arraylist.c +93 -0
- data/ext/json-c-0.8/arraylist.h +45 -0
- data/ext/json-c-0.8/bits.h +27 -0
- data/ext/json-c-0.8/config.guess +1526 -0
- data/ext/json-c-0.8/config.h.in +121 -0
- data/ext/json-c-0.8/config.sub +1658 -0
- data/ext/json-c-0.8/configure +14243 -0
- data/ext/json-c-0.8/configure.in +33 -0
- data/ext/json-c-0.8/debug.c +98 -0
- data/ext/json-c-0.8/debug.h +42 -0
- data/ext/json-c-0.8/depcomp +530 -0
- data/ext/json-c-0.8/doc/html/annotated.html +40 -0
- data/ext/json-c-0.8/doc/html/arraylist_8h.html +234 -0
- data/ext/json-c-0.8/doc/html/bits_8h.html +144 -0
- data/ext/json-c-0.8/doc/html/config_8h.html +606 -0
- data/ext/json-c-0.8/doc/html/debug_8h.html +386 -0
- data/ext/json-c-0.8/doc/html/doxygen.css +473 -0
- data/ext/json-c-0.8/doc/html/doxygen.png +0 -0
- data/ext/json-c-0.8/doc/html/files.html +42 -0
- data/ext/json-c-0.8/doc/html/functions.html +206 -0
- data/ext/json-c-0.8/doc/html/functions_vars.html +206 -0
- data/ext/json-c-0.8/doc/html/globals.html +445 -0
- data/ext/json-c-0.8/doc/html/globals_defs.html +200 -0
- data/ext/json-c-0.8/doc/html/globals_enum.html +50 -0
- data/ext/json-c-0.8/doc/html/globals_eval.html +135 -0
- data/ext/json-c-0.8/doc/html/globals_func.html +194 -0
- data/ext/json-c-0.8/doc/html/globals_type.html +58 -0
- data/ext/json-c-0.8/doc/html/globals_vars.html +50 -0
- data/ext/json-c-0.8/doc/html/index.html +25 -0
- data/ext/json-c-0.8/doc/html/json_8h.html +26 -0
- data/ext/json-c-0.8/doc/html/json__object_8h.html +1042 -0
- data/ext/json-c-0.8/doc/html/json__object__private_8h.html +69 -0
- data/ext/json-c-0.8/doc/html/json__tokener_8h.html +360 -0
- data/ext/json-c-0.8/doc/html/json__util_8h.html +100 -0
- data/ext/json-c-0.8/doc/html/linkhash_8h.html +734 -0
- data/ext/json-c-0.8/doc/html/printbuf_8h.html +171 -0
- data/ext/json-c-0.8/doc/html/structarray__list.html +104 -0
- data/ext/json-c-0.8/doc/html/structjson__object.html +141 -0
- data/ext/json-c-0.8/doc/html/structjson__object__iter.html +87 -0
- data/ext/json-c-0.8/doc/html/structjson__tokener.html +206 -0
- data/ext/json-c-0.8/doc/html/structjson__tokener__srec.html +104 -0
- data/ext/json-c-0.8/doc/html/structlh__entry.html +105 -0
- data/ext/json-c-0.8/doc/html/structlh__table.html +275 -0
- data/ext/json-c-0.8/doc/html/structprintbuf.html +87 -0
- data/ext/json-c-0.8/doc/html/tab_b.gif +0 -0
- data/ext/json-c-0.8/doc/html/tab_l.gif +0 -0
- data/ext/json-c-0.8/doc/html/tab_r.gif +0 -0
- data/ext/json-c-0.8/doc/html/tabs.css +102 -0
- data/ext/json-c-0.8/doc/html/unionjson__object_1_1data.html +140 -0
- data/ext/json-c-0.8/install-sh +519 -0
- data/ext/json-c-0.8/json.h +31 -0
- data/ext/json-c-0.8/json.pc.in +11 -0
- data/ext/json-c-0.8/json_object.c +511 -0
- data/ext/json-c-0.8/json_object.h +310 -0
- data/ext/json-c-0.8/json_object_private.h +44 -0
- data/ext/json-c-0.8/json_tokener.c +517 -0
- data/ext/json-c-0.8/json_tokener.h +90 -0
- data/ext/json-c-0.8/json_util.c +122 -0
- data/ext/json-c-0.8/json_util.h +23 -0
- data/ext/json-c-0.8/linkhash.c +218 -0
- data/ext/json-c-0.8/linkhash.h +264 -0
- data/ext/json-c-0.8/ltmain.sh +7880 -0
- data/ext/json-c-0.8/missing +360 -0
- data/ext/json-c-0.8/printbuf.c +145 -0
- data/ext/json-c-0.8/printbuf.h +38 -0
- data/ext/json-c-0.8/test1.c +164 -0
- data/ext/json-c-0.8/test2.c +20 -0
- data/ext/json-c-0.8/test3.c +22 -0
- data/ext/ordered_json_c.c +199 -0
- data/lib/ordered_json.rb +26 -0
- data/ordered_json.gemspec +102 -0
- data/test/crashing_example.rb +1 -0
- data/test/ordered_json_test.rb +86 -0
- data/test/pretty.json +11 -0
- metadata +91 -50
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#include <stdio.h>
|
|
2
|
+
#include <stdlib.h>
|
|
3
|
+
#include <stddef.h>
|
|
4
|
+
#include <string.h>
|
|
5
|
+
|
|
6
|
+
#include "json.h"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
int main(int argc, char **argv)
|
|
10
|
+
{
|
|
11
|
+
struct json_object *new_obj;
|
|
12
|
+
|
|
13
|
+
MC_SET_DEBUG(1);
|
|
14
|
+
|
|
15
|
+
new_obj = json_tokener_parse("/* more difficult test case */ { \"glossary\": { \"title\": \"example glossary\", \"GlossDiv\": { \"title\": \"S\", \"GlossList\": [ { \"ID\": \"SGML\", \"SortAs\": \"SGML\", \"GlossTerm\": \"Standard Generalized Markup Language\", \"Acronym\": \"SGML\", \"Abbrev\": \"ISO 8879:1986\", \"GlossDef\": \"A meta-markup language, used to create markup languages such as DocBook.\", \"GlossSeeAlso\": [\"GML\", \"XML\", \"markup\"] } ] } } }");
|
|
16
|
+
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
|
17
|
+
json_object_put(new_obj);
|
|
18
|
+
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#include <stdio.h>
|
|
2
|
+
#include <stdlib.h>
|
|
3
|
+
|
|
4
|
+
#include "json.h"
|
|
5
|
+
|
|
6
|
+
int
|
|
7
|
+
main()
|
|
8
|
+
{
|
|
9
|
+
struct json_object *jobj;
|
|
10
|
+
char *input = malloc(1024);
|
|
11
|
+
|
|
12
|
+
while (fgets(input, 1024, stdin) != NULL) {
|
|
13
|
+
jobj = json_tokener_parse(input);
|
|
14
|
+
if (is_error(jobj)) {
|
|
15
|
+
printf("error parsing json\n");
|
|
16
|
+
} else {
|
|
17
|
+
printf("%s\n", json_object_to_json_string(jobj));
|
|
18
|
+
json_object_put(jobj);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#include "ruby.h"
|
|
2
|
+
#include "json-c-0.8/json.h"
|
|
3
|
+
#include "json-c-0.8/printbuf.h"
|
|
4
|
+
#include <stdio.h>
|
|
5
|
+
#include <stdbool.h>
|
|
6
|
+
|
|
7
|
+
VALUE oj_dump(VALUE, VALUE, VALUE);
|
|
8
|
+
struct json_object* oj_dump_json(VALUE obj);
|
|
9
|
+
struct json_object* oj_dump_json_hash(VALUE obj);
|
|
10
|
+
struct json_object* oj_dump_json_array(VALUE obj);
|
|
11
|
+
|
|
12
|
+
char* oj_pretty_dump(struct json_object* json, struct printbuf *buf, int depth);
|
|
13
|
+
|
|
14
|
+
VALUE oj_parse(VALUE, VALUE, VALUE);
|
|
15
|
+
VALUE oj_build(struct json_object *, VALUE);
|
|
16
|
+
VALUE oj_build_object(struct json_object *, VALUE);
|
|
17
|
+
VALUE oj_build_array(struct json_object *, VALUE);
|
|
18
|
+
|
|
19
|
+
VALUE rb_dump_error;
|
|
20
|
+
VALUE rb_parse_error;
|
|
21
|
+
|
|
22
|
+
void Init_ordered_json_c()
|
|
23
|
+
{
|
|
24
|
+
rb_dump_error = rb_eval_string("OrderedJSON::DumpError");
|
|
25
|
+
rb_parse_error = rb_eval_string("OrderedJSON::ParseError");
|
|
26
|
+
VALUE c_oj = rb_define_class("OrderedJSONC", rb_cObject);
|
|
27
|
+
rb_define_singleton_method(c_oj, "parse", oj_parse, 2);
|
|
28
|
+
rb_define_singleton_method(c_oj, "dump", oj_dump, 2);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
VALUE oj_parse(VALUE self, VALUE str, VALUE hash_class){
|
|
32
|
+
VALUE out;
|
|
33
|
+
char *c_str = STR2CSTR(str);
|
|
34
|
+
struct json_object* json = json_tokener_parse(c_str);
|
|
35
|
+
if(is_error(json)) {
|
|
36
|
+
rb_raise(rb_parse_error, "Invalid JSON");
|
|
37
|
+
} else {
|
|
38
|
+
out = oj_build(json, hash_class);
|
|
39
|
+
}
|
|
40
|
+
json_object_put(json);
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
VALUE oj_dump(VALUE self, VALUE obj, VALUE pretty) {
|
|
45
|
+
struct json_object* json = oj_dump_json(obj);
|
|
46
|
+
struct printbuf *buf = printbuf_new();
|
|
47
|
+
char *cstr = (pretty != Qfalse && pretty != Qnil) ?
|
|
48
|
+
oj_pretty_dump(json, buf, 0) :
|
|
49
|
+
json_object_to_json_string(json);
|
|
50
|
+
VALUE out = rb_str_new2(cstr);
|
|
51
|
+
json_object_put(json);
|
|
52
|
+
printbuf_free(buf);
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
char* tabs(int num) {
|
|
57
|
+
char *tabs = malloc(num + 2);
|
|
58
|
+
*tabs = '\n';
|
|
59
|
+
for(int i = 0; i < num; i++){
|
|
60
|
+
*(tabs + i + 1) = '\t';
|
|
61
|
+
}
|
|
62
|
+
*(tabs + num + 1) = 0;
|
|
63
|
+
return tabs;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
char* oj_pretty_dump(struct json_object* json, struct printbuf *buf, int depth) {
|
|
67
|
+
if(json != NULL) {
|
|
68
|
+
switch(json_object_get_type(json)){
|
|
69
|
+
case json_type_object:
|
|
70
|
+
oj_pretty_dump_object(json, buf, depth);
|
|
71
|
+
break;
|
|
72
|
+
case json_type_array:
|
|
73
|
+
oj_pretty_dump_array(json, buf, depth);
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
sprintbuf(buf, "%s", json_object_to_json_string(json));
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
sprintbuf(buf, "null");
|
|
80
|
+
}
|
|
81
|
+
return buf->buf;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void oj_pretty_dump_object(struct json_object* json, struct printbuf *buf, int depth) {
|
|
85
|
+
struct json_object *jtmp;
|
|
86
|
+
char *space = tabs(depth);
|
|
87
|
+
char *space1 = tabs(depth + 1);
|
|
88
|
+
char *comma = "";
|
|
89
|
+
sprintbuf(buf, "{");
|
|
90
|
+
json_object_object_foreach(json, key, val) {
|
|
91
|
+
jtmp = json_object_new_string(key);
|
|
92
|
+
sprintbuf(buf, "%s%s%s: ", comma, space1, json_object_to_json_string(jtmp));
|
|
93
|
+
json_object_put(jtmp);
|
|
94
|
+
oj_pretty_dump(val, buf, depth + 1);
|
|
95
|
+
comma = ",";
|
|
96
|
+
}
|
|
97
|
+
sprintbuf(buf, "%s}", space);
|
|
98
|
+
free(space);
|
|
99
|
+
free(space1);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void oj_pretty_dump_array(struct json_object* json, struct printbuf *buf, int depth) {
|
|
103
|
+
int len = json_object_array_length(json);
|
|
104
|
+
char *space = (len < 2) ? strdup("") : tabs(depth);
|
|
105
|
+
char *space1 = (len < 2) ? strdup("") : tabs(depth + 1);
|
|
106
|
+
sprintbuf(buf, "[ ");
|
|
107
|
+
for(int i = 0; i < len; i++) {
|
|
108
|
+
char *comma = i == 0 ? "" : ", ";
|
|
109
|
+
sprintbuf(buf, "%s%s", comma, space1);
|
|
110
|
+
oj_pretty_dump(json_object_array_get_idx(json, i), buf, depth + 1);
|
|
111
|
+
}
|
|
112
|
+
sprintbuf(buf, " %s]", space);
|
|
113
|
+
free(space);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
struct json_object* oj_dump_json(VALUE obj) {
|
|
117
|
+
switch(TYPE(obj)) {
|
|
118
|
+
case T_OBJECT:
|
|
119
|
+
case T_HASH:
|
|
120
|
+
return oj_dump_json_hash(obj);
|
|
121
|
+
case T_FLOAT:
|
|
122
|
+
return json_object_new_double(NUM2DBL(obj));
|
|
123
|
+
case T_STRING:
|
|
124
|
+
return json_object_new_string(STR2CSTR(obj));
|
|
125
|
+
case T_ARRAY:
|
|
126
|
+
return oj_dump_json_array(obj);
|
|
127
|
+
case T_FIXNUM:
|
|
128
|
+
case T_BIGNUM:
|
|
129
|
+
return json_object_new_int(NUM2INT(obj));
|
|
130
|
+
case T_TRUE:
|
|
131
|
+
return json_object_new_boolean(1);
|
|
132
|
+
case T_FALSE:
|
|
133
|
+
return json_object_new_boolean(0);
|
|
134
|
+
case T_NIL:
|
|
135
|
+
default:
|
|
136
|
+
return NULL;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
struct json_object* oj_dump_json_hash(VALUE hash) {
|
|
141
|
+
struct json_object *json = json_object_new_object();
|
|
142
|
+
VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
|
|
143
|
+
VALUE values = rb_funcall(hash, rb_intern("values"), 0);
|
|
144
|
+
int len = RARRAY(keys)->len;
|
|
145
|
+
for(int i = 0; i < len; i++) {
|
|
146
|
+
json_object_object_add(json,
|
|
147
|
+
STR2CSTR(rb_funcall(rb_ary_entry(keys, i), rb_intern("to_s"), 0)),
|
|
148
|
+
oj_dump_json(rb_ary_entry(values, i))
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
return json;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
struct json_object* oj_dump_json_array(VALUE array) {
|
|
155
|
+
int len = RARRAY(array)->len;
|
|
156
|
+
struct json_object *json = json_object_new_array();;
|
|
157
|
+
for(int i = 0; i < len; i++) {
|
|
158
|
+
json_object_array_add(json, oj_dump_json(rb_ary_entry(array, i)));
|
|
159
|
+
}
|
|
160
|
+
return json;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
VALUE oj_build(struct json_object* json, VALUE hash_class){
|
|
164
|
+
if(json != NULL) {
|
|
165
|
+
switch(json_object_get_type(json)){
|
|
166
|
+
case json_type_null:
|
|
167
|
+
return Qnil;
|
|
168
|
+
case json_type_boolean:
|
|
169
|
+
return json_object_get_boolean(json) ? Qtrue : Qfalse;
|
|
170
|
+
case json_type_double:
|
|
171
|
+
return rb_float_new(json_object_get_double(json));
|
|
172
|
+
case json_type_int:
|
|
173
|
+
return INT2FIX(json_object_get_int(json));
|
|
174
|
+
case json_type_object:
|
|
175
|
+
return oj_build_object(json, hash_class);
|
|
176
|
+
case json_type_array:
|
|
177
|
+
return oj_build_array(json, hash_class);
|
|
178
|
+
case json_type_string:
|
|
179
|
+
return rb_str_new2(json_object_get_string(json));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return Qnil;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
VALUE oj_build_object(struct json_object * json, VALUE hash_class) {
|
|
186
|
+
VALUE hash = rb_funcall(hash_class, rb_intern("new"), 0);
|
|
187
|
+
json_object_object_foreach(json, key, value) {
|
|
188
|
+
rb_funcall(hash, rb_intern("[]="), 2, rb_str_new2(key), oj_build(value, hash_class));
|
|
189
|
+
}
|
|
190
|
+
return hash;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
VALUE oj_build_array(struct json_object * json, VALUE hash_class) {
|
|
194
|
+
VALUE array = rb_ary_new();
|
|
195
|
+
for(int i = 0; i < json_object_array_length(json); i++) {
|
|
196
|
+
rb_ary_push(array, oj_build(json_object_array_get_idx(json, i), hash_class));
|
|
197
|
+
}
|
|
198
|
+
return array;
|
|
199
|
+
}
|
data/lib/ordered_json.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require 'collections/sequenced_hash'
|
|
3
|
+
|
|
4
|
+
class OrderedHash < SequencedHash; end
|
|
5
|
+
|
|
6
|
+
module OrderedJSON
|
|
7
|
+
class ParseError < RuntimeError; end
|
|
8
|
+
class DumpError < RuntimeError; end
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def parse(str)
|
|
12
|
+
::OrderedJSONC.parse(str, OrderedHash)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def dump(obj, pretty = false)
|
|
16
|
+
::OrderedJSONC.dump(obj, pretty)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def pretty_dump(obj)
|
|
20
|
+
dump(obj, true)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
extend self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
require File.dirname(__FILE__) + "/../ext/ordered_json_c"
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
Gem::Specification.new do |s|
|
|
2
|
+
s.name = "ordered_json"
|
|
3
|
+
s.version = "0.3.2"
|
|
4
|
+
s.date = "2009-03-19"
|
|
5
|
+
s.summary = "Ordered json hash conversion "
|
|
6
|
+
s.email = "kyle@kylemaxwell.com"
|
|
7
|
+
s.has_rdoc = true
|
|
8
|
+
s.extensions = "ext/extconf.rb"
|
|
9
|
+
s.authors = ["Kyle Maxwell"]
|
|
10
|
+
s.files = %w[
|
|
11
|
+
.gitignore
|
|
12
|
+
CHANGELOG
|
|
13
|
+
ext/extconf.rb
|
|
14
|
+
ext/json-c-0.8/aclocal.m4
|
|
15
|
+
ext/json-c-0.8/arraylist.c
|
|
16
|
+
ext/json-c-0.8/arraylist.h
|
|
17
|
+
ext/json-c-0.8/AUTHORS
|
|
18
|
+
ext/json-c-0.8/bits.h
|
|
19
|
+
ext/json-c-0.8/ChangeLog
|
|
20
|
+
ext/json-c-0.8/config.guess
|
|
21
|
+
ext/json-c-0.8/config.h.in
|
|
22
|
+
ext/json-c-0.8/config.sub
|
|
23
|
+
ext/json-c-0.8/configure
|
|
24
|
+
ext/json-c-0.8/configure.in
|
|
25
|
+
ext/json-c-0.8/COPYING
|
|
26
|
+
ext/json-c-0.8/debug.c
|
|
27
|
+
ext/json-c-0.8/debug.h
|
|
28
|
+
ext/json-c-0.8/depcomp
|
|
29
|
+
ext/json-c-0.8/doc/html/annotated.html
|
|
30
|
+
ext/json-c-0.8/doc/html/arraylist_8h.html
|
|
31
|
+
ext/json-c-0.8/doc/html/bits_8h.html
|
|
32
|
+
ext/json-c-0.8/doc/html/config_8h.html
|
|
33
|
+
ext/json-c-0.8/doc/html/debug_8h.html
|
|
34
|
+
ext/json-c-0.8/doc/html/doxygen.css
|
|
35
|
+
ext/json-c-0.8/doc/html/doxygen.png
|
|
36
|
+
ext/json-c-0.8/doc/html/files.html
|
|
37
|
+
ext/json-c-0.8/doc/html/functions.html
|
|
38
|
+
ext/json-c-0.8/doc/html/functions_vars.html
|
|
39
|
+
ext/json-c-0.8/doc/html/globals.html
|
|
40
|
+
ext/json-c-0.8/doc/html/globals_defs.html
|
|
41
|
+
ext/json-c-0.8/doc/html/globals_enum.html
|
|
42
|
+
ext/json-c-0.8/doc/html/globals_eval.html
|
|
43
|
+
ext/json-c-0.8/doc/html/globals_func.html
|
|
44
|
+
ext/json-c-0.8/doc/html/globals_type.html
|
|
45
|
+
ext/json-c-0.8/doc/html/globals_vars.html
|
|
46
|
+
ext/json-c-0.8/doc/html/index.html
|
|
47
|
+
ext/json-c-0.8/doc/html/json_8h.html
|
|
48
|
+
ext/json-c-0.8/doc/html/json__object_8h.html
|
|
49
|
+
ext/json-c-0.8/doc/html/json__object__private_8h.html
|
|
50
|
+
ext/json-c-0.8/doc/html/json__tokener_8h.html
|
|
51
|
+
ext/json-c-0.8/doc/html/json__util_8h.html
|
|
52
|
+
ext/json-c-0.8/doc/html/linkhash_8h.html
|
|
53
|
+
ext/json-c-0.8/doc/html/printbuf_8h.html
|
|
54
|
+
ext/json-c-0.8/doc/html/structarray__list.html
|
|
55
|
+
ext/json-c-0.8/doc/html/structjson__object.html
|
|
56
|
+
ext/json-c-0.8/doc/html/structjson__object__iter.html
|
|
57
|
+
ext/json-c-0.8/doc/html/structjson__tokener.html
|
|
58
|
+
ext/json-c-0.8/doc/html/structjson__tokener__srec.html
|
|
59
|
+
ext/json-c-0.8/doc/html/structlh__entry.html
|
|
60
|
+
ext/json-c-0.8/doc/html/structlh__table.html
|
|
61
|
+
ext/json-c-0.8/doc/html/structprintbuf.html
|
|
62
|
+
ext/json-c-0.8/doc/html/tab_b.gif
|
|
63
|
+
ext/json-c-0.8/doc/html/tab_l.gif
|
|
64
|
+
ext/json-c-0.8/doc/html/tab_r.gif
|
|
65
|
+
ext/json-c-0.8/doc/html/tabs.css
|
|
66
|
+
ext/json-c-0.8/doc/html/unionjson__object_1_1data.html
|
|
67
|
+
ext/json-c-0.8/INSTALL
|
|
68
|
+
ext/json-c-0.8/install-sh
|
|
69
|
+
ext/json-c-0.8/json.h
|
|
70
|
+
ext/json-c-0.8/json.pc.in
|
|
71
|
+
ext/json-c-0.8/json_object.c
|
|
72
|
+
ext/json-c-0.8/json_object.h
|
|
73
|
+
ext/json-c-0.8/json_object_private.h
|
|
74
|
+
ext/json-c-0.8/json_tokener.c
|
|
75
|
+
ext/json-c-0.8/json_tokener.h
|
|
76
|
+
ext/json-c-0.8/json_util.c
|
|
77
|
+
ext/json-c-0.8/json_util.h
|
|
78
|
+
ext/json-c-0.8/linkhash.c
|
|
79
|
+
ext/json-c-0.8/linkhash.h
|
|
80
|
+
ext/json-c-0.8/ltmain.sh
|
|
81
|
+
ext/json-c-0.8/Makefile.am
|
|
82
|
+
ext/json-c-0.8/Makefile.in
|
|
83
|
+
ext/json-c-0.8/missing
|
|
84
|
+
ext/json-c-0.8/NEWS
|
|
85
|
+
ext/json-c-0.8/printbuf.c
|
|
86
|
+
ext/json-c-0.8/printbuf.h
|
|
87
|
+
ext/json-c-0.8/README
|
|
88
|
+
ext/json-c-0.8/test1.c
|
|
89
|
+
ext/json-c-0.8/test2.c
|
|
90
|
+
ext/json-c-0.8/test3.c
|
|
91
|
+
ext/Makefile
|
|
92
|
+
ext/ordered_json_c.c
|
|
93
|
+
lib/ordered_json.rb
|
|
94
|
+
ordered_json.gemspec
|
|
95
|
+
Rakefile
|
|
96
|
+
README
|
|
97
|
+
test/crashing_example.rb
|
|
98
|
+
test/ordered_json_test.rb
|
|
99
|
+
test/pretty.json
|
|
100
|
+
]
|
|
101
|
+
s.add_dependency("collections", ["> 0.0.0"])
|
|
102
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"days"=>[{"day"=>"Today", "links"=>[{"title"=>"search freebies and free samples", "url"=>"/search.html"}, {"title"=>"link to freebie finder", "url"=>"/link.html"}, {"title"=>"friends of freebie finder", "url"=>"/links.html"}, {"title"=>"freebie tips", "url"=>"/tips.html"}, {"title"=>"freebies by email", "url"=>"http://www.feedblitz.com/f/?Sub=70455"}, {"title"=>"forum", "url"=>"http://forum.absurdlycool.com/"}, {"title"=>"freebies by RSS", "url"=>"/rss.html"}, {"title"=>"suggestions are always appreciated", "url"=>"/contact.cgi"}, {"title"=>"check out our new forum!", "url"=>"http://forum.absurdlycool.com"}, {"title"=>"Introducing Freebie Finder Forums!", "url"=>"http://forum.absurdlycool.com/"}, {"title"=>"uk", "url"=>"http://absurdlycool.com/UK/all-freebies"}, {"title"=>"canada", "url"=>"http://absurdlycool.com/CANADA/all-freebies"}, {"title"=>"usa", "url"=>"http://absurdlycool.com/USA/all-freebies"}, {"title"=>"Free Bread Breakthrough Recipe Book", "url"=>"http://www.breadbreakthrough.com/Default.aspx"}, {"title"=>"food", "url"=>"http://absurdlycool.com/all/food-freebies"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10442/free-bread-breakthrough-recipe-book"}, {"title"=>"success. To order today, click here No shipping and handling fees", "url"=>"http://www.breadbreakthrough.com/Redemption.aspx"}, {"title"=>"food", "url"=>"http://absurdlycool.com/all/food-freebies"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10443/success-to-order-today-click-here-no-shipping-and-handling-fees"}, {"title"=>"Miscellaneous :: Wildflower Guidebook and catalog", "url"=>"http://www.wildseedfarms.com/catalog.html"}, {"title"=>"Thunderfap", "url"=>"http://www.thunderfap.com/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10444/miscellaneous-wildflower-guidebook-and-catalog"}, {"title"=>"Segue to Solar--Free Solar Sticker or Message Magnet", "url"=>"http://www.seguetosolar.com/freesticker.html"}, {"title"=>"kids", "url"=>"http://absurdlycool.com/all/kids-freebies"}, {"title"=>"Pumpkinhead", "url"=>"http://www.webspawner.com/users/pumpkinheadtwo/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10445/segue-to-solar-free-solar-sticker-or-message-magnet"}, {"title"=>"Aerie Undies--Free Pair of Undies at Aerie Store ( 3/12 - 3/18", "url"=>"http://view.ed4.net/v/XHBORK/AY8T0/0G2OD8R/QEV01H/MAILACTION=1&FORMAT=H"}, {"title"=>"coupons", "url"=>"http://absurdlycool.com/all/coupons"}, {"title"=>"Thunderfap", "url"=>"http://www.thunderfap.com/"}, {"title"=>"Pumpkinhead", "url"=>"http://www.webspawner.com/users/pumpkinheadtwo/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10441/aerie-undies-free-pair-of-undies-at-aerie-store-3-12-3-18"}, {"title"=>"Free 25 staples Gift Card for Teachers", "url"=>"http://www.staples.com/sbd/cre/marketing/schoolkidz/"}, {"title"=>"gifts", "url"=>"http://absurdlycool.com/all/gifts"}, {"title"=>"food", "url"=>"http://absurdlycool.com/all/food-freebies"}, {"title"=>"software", "url"=>"http://absurdlycool.com/all/software-freebies"}, {"title"=>"educational", "url"=>"http://absurdlycool.com/all/educational-freebies"}, {"title"=>"Fab Free", "url"=>"http://www.fabfree.com/"}, {"title"=>"Free Channel", "url"=>"http://www.freechannel.net/new.html"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10440/free-25-staples-gift-card-for-teachers"}]}, {"day"=>"Sat, 14 Mar 2009", "links"=>[{"title"=>"Free subscription to car and driver", "url"=>"http://www.freebizmag.com/emailcardriver04welcome.htm"}, {"title"=>"email", "url"=>"http://absurdlycool.com/all/email-freebies"}, {"title"=>"cars", "url"=>"http://absurdlycool.com/all/cars-freebies"}, {"title"=>"media", "url"=>"http://absurdlycool.com/all/media-freebies"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10436/free-subscription-to-car-and-driver"}, {"title"=>"Free tote from vix swimwear ", "url"=>"http://www.vixswimwear.com/vip-signup.asp"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"Freebeez and Dealz", "url"=>"http://www.freebeezndealz.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10437/free-tote-from-vix-swimwear"}, {"title"=>"To get the Free Obesity Action Coalition posters, BMI charts, and", "url"=>"http://www.obesityaction.org/ordermaterials/overview.php"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"FreeGrabber", "url"=>"http://www.freegrabber.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10438/to-get-the-free-obesity-action-coalition-posters-bmi-charts-and"}, {"title"=>"Bra--Free Bra for Survey Participation - As Seen on Oprah", "url"=>"http://www.cybersurvey.com/surveys/Oprah/B01.htm"}, {"title"=>"clothing", "url"=>"http://absurdlycool.com/all/clothing-freebies"}, {"title"=>"Freebeez and Dealz", "url"=>"http://www.freebeezndealz.com/"}, {"title"=>"Pumpkinhead", "url"=>"http://www.webspawner.com/users/pumpkinheadtwo/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10439/bra-free-bra-for-survey-participation-as-seen-on-oprah"}, {"title"=>"Sign up here for a complimentary 2-issue to Redbook.", "url"=>"http://www.valuemags.com/freeoffer/freeoffer.asp?offer=Redbook_BBS"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"FreeSnatcher", "url"=>"http://www.freesnatcher.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10435/sign-up-here-for-a-complimentary-2-issue-to-redbook"}, {"title"=>"Free Brewmasters Tasting Kit From Killians Irish Red", "url"=>"http://georgekillians.com/"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"FreeStuff.com", "url"=>"http://freestuff.com"}, {"title"=>"Just Free Stuff", "url"=>"http://www.justfreestuff.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10434/free-brewmasters-tasting-kit-from-killians-irish-red"}]}, {"day"=>"Fri, 13 Mar 2009", "links"=>[{"title"=>" Kodak Gallery - 20 FREE PRINTS for new Members", "url"=>"http://www.kodakgallery.com/Welcome.jsp"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10431/kodak-gallery-20-free-prints-for-new-members"}, {"title"=>"GoodNites--Free sample Pair of GoodNites Boxers for Boys", "url"=>"http://fsisolutions.com/kcgoodnitesboxers/"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Pumpkinhead", "url"=>"http://www.webspawner.com/users/pumpkinheadtwo/"}, {"title"=>"FreeGrabber", "url"=>"http://www.freegrabber.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10432/goodnites-free-sample-pair-of-goodnites-boxers-for-boys"}, {"title"=>"Free Bridal Invitations", "url"=>"http://www.annsbridalbargains.com/WE_SearchResults.cfm?prev=1&TempPrev=0&blnPreviewRequestSubmitted=0&recordsperpage=8&CompletedOrder=0&sBasketID=0&alogo=1&menu=none&morethanonepage=YES&HostDomain=0&FirstTimeThrough=1&option=WE_SearchResults.cfm&format=WedEnsVAa&vid=7597897CE2&CFID=70302588&CFTOKEN=38067380"}, {"title"=>"FreeSnatcher", "url"=>"http://www.freesnatcher.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10433/free-bridal-invitations"}, {"title"=>"Nicoderm CQ Sample ", "url"=>"http://lm.logicalmedia.com/z/8170/CD339/"}, {"title"=>"health", "url"=>"http://absurdlycool.com/all/health-freebies"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10430/nicoderm-cq-sample"}, {"title"=>"Get a Free Undie at Aerie Store", "url"=>"http://view.ed4.net/v/XHBORK/AY8T0/0G2OD8R/QEV01H/MAILACTION=1&FORMAT=H"}, {"title"=>"FreeSnatcher", "url"=>"http://www.freesnatcher.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10429/get-a-free-undie-at-aerie-store"}, {"title"=>"Free Campbells Tomato Seeds", "url"=>"http://www.helpgrowyoursoup.com/"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Yes All 4 Free", "url"=>"http://www.yesall4free.com/"}, {"title"=>"Just Free Stuff", "url"=>"http://www.justfreestuff.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10426/free-campbells-tomato-seeds"}, {"title"=>"Free Eye Facts for Children Poster", "url"=>"http://catalog.nei.nih.gov/productcart/pc/viewPrd.asp?idcategory=21&idproduct=131#"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10427/free-eye-facts-for-children-poster"}, {"title"=>"Free 2009 Wildflower Reference Guide", "url"=>"http://www.wildseedfarms.com/index.html"}, {"title"=>"Fab Free", "url"=>"http://www.fabfree.com/"}, {"title"=>"Just Free Stuff", "url"=>"http://www.justfreestuff.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10428/free-2009-wildflower-reference-guide"}]}, {"day"=>"Thu, 12 Mar 2009", "links"=>[{"title"=>"Free sample of ID personal lubricant", "url"=>"http://www.idlube.com/surveys/survey.php"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10424/free-sample-of-id-personal-lubricant"}, {"title"=>"Free Aveda shampoo", "url"=>"http://www.cedarhut.com/free_stuff_promo3.php"}, {"title"=>"beauty", "url"=>"http://absurdlycool.com/all/beauty-freebies"}, {"title"=>"Freebeez and Dealz", "url"=>"http://www.freebeezndealz.com/"}, {"title"=>"Thunderfap", "url"=>"http://www.thunderfap.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10425/free-aveda-shampoo"}, {"title"=>"Free Vegetarian Starter Kit", "url"=>"http://www.mercyforanimals.org/vegan-starter-kit.aspx"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10423/free-vegetarian-starter-kit"}, {"title"=>"Win prizes and possibly $5000 by joining the Ipsos i-Say Panel", "url"=>"http://lm.logicalmedia.com/z/6691/CD339/"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10422/win-prizes-and-possibly-5000-by-joining-the-ipsos-i-say-panel"}, {"title"=>"Try the new Arbys Roast Burger free w/ the purchase of a soft", "url"=>"http://www.arbys.com/arbyscoupon/?cid=bn_msn300x250030909"}, {"title"=>"Freebeez and Dealz", "url"=>"http://www.freebeezndealz.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10421/try-the-new-arbys-roast-burger-free-w-the-purchase-of-a-soft"}, {"title"=>"Free Shirt--Free T-Shirt from AudioVox for Uploaded Image", "url"=>"http://www.audiovoxconsumer.com/voxxconsumers/VoxxconsumersInfo.do?ACTION_TYPE_ID=ACTION_TYPE_EXISITING_CONTEST_DETAIL"}, {"title"=>"clothing", "url"=>"http://absurdlycool.com/all/clothing-freebies"}, {"title"=>"webmaster", "url"=>"http://absurdlycool.com/all/webmaster-freebies"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Pumpkinhead", "url"=>"http://www.webspawner.com/users/pumpkinheadtwo/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10420/free-shirt-free-t-shirt-from-audiovox-for-uploaded-image"}, {"title"=>"Free sample of Beyond Seven Condoms ", "url"=>"http://www.beyondsevencondoms.com/htmls/free_sample-eval.asp"}, {"title"=>"health", "url"=>"http://absurdlycool.com/all/health-freebies"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10418/free-sample-of-beyond-seven-condoms"}, {"title"=>"Free Song Download - Seven Mile Breakdown by Taylor Hicks", "url"=>"http://www.amazon.com/gp/product/B001U8T2WI?ie=UTF8&tag=awesdeal-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=B001U8T2WI"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10419/free-song-download-seven-mile-breakdown-by-taylor-hicks"}]}, {"day"=>"Wed, 11 Mar 2009", "links"=>[{"title"=>"To get the Free sample bottle Aveda Black Malva Pure Plant shampoo", "url"=>"http://www.cedarhut.com/survey03_promo.php"}, {"title"=>"beauty", "url"=>"http://absurdlycool.com/all/beauty-freebies"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10417/to-get-the-free-sample-bottle-aveda-black-malva-pure-plant-shampoo"}, {"title"=>"Food :: Free Candy Pocket Tin Sample", "url"=>"http://billyboycandiesonline.com/ourcandy.html"}, {"title"=>"food", "url"=>"http://absurdlycool.com/all/food-freebies"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10415/food-free-candy-pocket-tin-sample"}, {"title"=>"Find the location nearest you to get your free sample of Fuji", "url"=>"http://www.sobeworld.com/index.php"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10411/find-the-location-nearest-you-to-get-your-free-sample-of-fuji"}, {"title"=>"Free 25 Chick Downtown Gift Card", "url"=>"http://chickdowntown.com/shopping_spree.asp"}, {"title"=>"gifts", "url"=>"http://absurdlycool.com/all/gifts"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10412/free-25-chick-downtown-gift-card"}, {"title"=>"Food :: Free Taco from Taco Del Mar", "url"=>"http://www.tacodelmar.com/tdm001_2009a/taxes_2009_choice.html"}, {"title"=>"food", "url"=>"http://absurdlycool.com/all/food-freebies"}, {"title"=>"coupons", "url"=>"http://absurdlycool.com/all/coupons"}, {"title"=>"Thunderfap", "url"=>"http://www.thunderfap.com/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10413/food-free-taco-from-taco-del-mar"}, {"title"=>"Kids :: Kidscope Comic and DVD", "url"=>"http://www.kidscope.org/individual_order.html"}, {"title"=>"kids", "url"=>"http://absurdlycool.com/all/kids-freebies"}, {"title"=>"Thunderfap", "url"=>"http://www.thunderfap.com/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10414/kids-kidscope-comic-and-dvd"}, {"title"=>"Free Tee Shirt From Bobs Garage", "url"=>"http://www.bobs-garage.com/"}, {"title"=>"clothing", "url"=>"http://absurdlycool.com/all/clothing-freebies"}, {"title"=>"Fab Free", "url"=>"http://www.fabfree.com/"}, {"title"=>"Just Free Stuff", "url"=>"http://www.justfreestuff.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10410/free-tee-shirt-from-bobs-garage"}]}, {"day"=>"Tue, 10 Mar 2009", "links"=>[{"title"=>"Free Matrix Biolage sample ", "url"=>"http://www.matrix.com/advert/2009/01Rejuva/"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10407/free-matrix-biolage-sample"}, {"title"=>"To get your Free Volpi Italian meat product sample click on the", "url"=>"http://www.volpifoods.com/join-the-vip-club/"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"WeLoveFreeSamples", "url"=>"http://welovefreesamples.blogspot.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10409/to-get-your-free-volpi-italian-meat-product-sample-click-on-the"}, {"title"=>"Free Aveda Product Sample", "url"=>"http://downloads.self.com/self/pdfs/AvedaCoupon.pdf"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10405/free-aveda-product-sample"}, {"title"=>"Free Sample of Emergen-C Drink Mix", "url"=>"http://www.emergenc.com/bubbles/"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"FreeGrabber", "url"=>"http://www.freegrabber.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10406/free-sample-of-emergen-c-drink-mix"}, {"title"=>"Click here to request your free wedding catalog", "url"=>"http://www.gunthergifts.com/catalog-request-form.html"}, {"title"=>"Free Sample Direct", "url"=>"http://freesamplesdirect.com/blog/"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"Active Freebies", "url"=>"http://www.active-freebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10401/click-here-to-request-your-free-wedding-catalog"}, {"title"=>"Scrabble Compete against others for FREE or for cash prizes playing", "url"=>"http://1.ofsnetwork.com/z/37870/CD5726/&dp=0&l=0&subid1=&subid2=&subid3=&subid4=&subid5="}, {"title"=>"Sassysue", "url"=>"http://www.sassysue.com/new.htm"}, {"title"=>"FreakyFreddies", "url"=>"http://www.freakyfreddies.com/canadianfreebies.htm"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10402/scrabble-compete-against-others-for-free-or-for-cash-prizes-playing"}, {"title"=>"Health :: Free Sample of Kotex Ultra Thin Overnight with", "url"=>"http://startsampling.com/sm/100664/captureAddress.iphtml?item=100664"}, {"title"=>"samples", "url"=>"http://absurdlycool.com/all/samples"}, {"title"=>"health", "url"=>"http://absurdlycool.com/all/health-freebies"}, {"title"=>"FreebieWatch", "url"=>"http://www.freebiewatch.com/"}, {"title"=>"I Crave Freebies", "url"=>"http://www.icravefreebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10403/health-free-sample-of-kotex-ultra-thin-overnight-with"}, {"title"=>"Free E-Cards Online ", "url"=>"http://www.free-e-cards-online.com"}, {"title"=>"Free Channel", "url"=>"http://www.freechannel.net/new.html"}, {"title"=>"Active Freebies", "url"=>"http://www.active-freebies.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10400/free-e-cards-online"}, {"title"=>"Training Socks--Free 2-Pack of Training Socks at Lucy Stores", "url"=>"http://www.lucy.com/jump.jsp?itemID=1047&itemType=CATEGORY&path1%2C3%2C120"}, {"title"=>"clothing", "url"=>"http://absurdlycool.com/all/clothing-freebies"}, {"title"=>"Pumpkinhead", "url"=>"http://www.webspawner.com/users/pumpkinheadtwo/"}, {"title"=>"Just Free Stuff", "url"=>"http://www.justfreestuff.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10399/training-socks-free-2-pack-of-training-socks-at-lucy-stores"}]}, {"day"=>"Mon, 9 Mar 2009", "links"=>[{"title"=>"Do You Own A Myspace Page, Website Or Blog?", "url"=>"http://www.readysite.com/"}, {"title"=>"Thunderfap", "url"=>"http://www.thunderfap.com/"}, {"title"=>"Yes All 4 Free", "url"=>"http://www.yesall4free.com/"}, {"title"=>"Just Free Stuff", "url"=>"http://www.justfreestuff.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10398/do-you-own-a-myspace-page-website-or-blog"}, {"title"=>"DVD--Free Healthy Home Party DVD ( code: HHP09 / 5984 )", "url"=>"http://www.surveymonkey.com/s.aspx?sm=rdNwplKmLgTDoVT0zh0Dwg_3d_3d"}, {"title"=>"health", "url"=>"http://absurdlycool.com/all/health-freebies"}, {"title"=>"home", "url"=>"http://absurdlycool.com/all/home-freebies"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Pumpkinhead", "url"=>"http://www.webspawner.com/users/pumpkinheadtwo/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10395/dvd-free-healthy-home-party-dvd-code-hhp09-5984"}, {"title"=>"Free 2 pack of training socks at Lucy Stores", "url"=>"http://www.lucy.com/jump.jsp?itemID=1047&itemType=CATEGORY&path1%2C3%2C120"}, {"title"=>"clothing", "url"=>"http://absurdlycool.com/all/clothing-freebies"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10396/free-2-pack-of-training-socks-at-lucy-stores"}, {"title"=>"Store Locator", "url"=>"http://www.lucy.com/jump.jsp?itemID=1017&itemType=StoreLocator"}, {"title"=>"Hunt4Freebies", "url"=>"http://www.hunt4freebies.com/"}, {"title"=>"Freebie Reporter", "url"=>"http://www.freebiereporter.com/"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10397/store-locator"}, {"title"=>"Free baby magazines, formula samples, diaper coupons, health information and more", "url"=>"http://lm.logicalmedia.com/z/6186/CD339/"}, {"title"=>"kids", "url"=>"http://absurdlycool.com/all/kids-freebies"}, {"title"=>"Link", "url"=>"http://absurdlycool.com/freebieorsample/10394/free-baby-magazines-formula-samples-diaper-coupons-health-information-and-more"}]}, {"day"=>"\n[view older freebies] ", "links"=>[{"title"=>"view older freebies", "url"=>"http://absurdlycool.com/?h=50"}, {"title"=>"Iteration Labs, LLC", "url"=>"http://iterationlabs.com"}, {"title"=>"Contact us", "url"=>"/contact.cgi"}, {"title"=>"Privacy policy", "url"=>"/privacy.html"}]}]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require File.dirname(__FILE__) + "/../lib/ordered_json"
|
|
3
|
+
require "json"
|
|
4
|
+
|
|
5
|
+
class OrderedJSONTest < Test::Unit::TestCase
|
|
6
|
+
|
|
7
|
+
def test_parse_nothing
|
|
8
|
+
assert_equal OrderedHash.new, OrderedJSON.parse("{}")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_simple_dump
|
|
12
|
+
assert_equal "{ }", OrderedJSON.dump({})
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_crash_example
|
|
16
|
+
@ruby = eval(File.read(File.dirname(__FILE__) + "/crashing_example.rb"))
|
|
17
|
+
json = OrderedJSON.dump(@ruby)
|
|
18
|
+
@back = OrderedJSON.parse(json)
|
|
19
|
+
assert_equal(@ruby, @back)
|
|
20
|
+
|
|
21
|
+
puts @back.inspect
|
|
22
|
+
|
|
23
|
+
json = OrderedJSON.pretty_dump(@ruby)
|
|
24
|
+
@back = OrderedJSON.parse(json)
|
|
25
|
+
assert_equal(@ruby, @back)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_invalid_json
|
|
29
|
+
assert_raises(OrderedJSON::ParseError) do
|
|
30
|
+
OrderedJSON.parse("not json")
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_pretty_dump
|
|
35
|
+
|
|
36
|
+
assert_equal File.read(File.dirname(__FILE__) + "/pretty.json"),
|
|
37
|
+
OrderedJSON.pretty_dump({"foo" => "bar",
|
|
38
|
+
"bar" => [{"dsfa" => {"asdf" => ["dsaf", nil]}}]
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
assert_equal %[{\n\t"foo": "bar"\n}], OrderedJSON.pretty_dump({"foo" => "bar"})
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_some_cases
|
|
45
|
+
obj = {"foo"=>{"bar"=>nil}}
|
|
46
|
+
OrderedJSON.dump(obj)
|
|
47
|
+
|
|
48
|
+
obj = OrderedHash.new
|
|
49
|
+
obj["foo"] = {"bar"=>nil}
|
|
50
|
+
OrderedJSON.dump(obj)
|
|
51
|
+
|
|
52
|
+
obj = OrderedHash.new
|
|
53
|
+
obj["foo"] = OrderedHash.new
|
|
54
|
+
OrderedJSON.dump(obj)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# The idea is to take random numericish keys with ordered
|
|
58
|
+
# alphabetic values, and assert that when we inspect various
|
|
59
|
+
# parts of the process, despite the random keys, the values are still
|
|
60
|
+
# ordered. See the values scan in assert_alphabet
|
|
61
|
+
def test_parsed_json_maintains_order
|
|
62
|
+
original = create_random_hash
|
|
63
|
+
dump = OrderedJSON.dump(original)
|
|
64
|
+
parsed = OrderedJSON.parse(dump)
|
|
65
|
+
|
|
66
|
+
assert_kind_of OrderedHash, parsed
|
|
67
|
+
assert_alphabet dump
|
|
68
|
+
assert_alphabet parsed.inspect
|
|
69
|
+
assert_equal original, parsed
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def assert_alphabet(obj)
|
|
73
|
+
alphabet = ("b".."z").to_a.join('')
|
|
74
|
+
found = obj.inspect.scan(/[a-z]/).flatten.join('')
|
|
75
|
+
assert_equal alphabet, found
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def create_random_hash
|
|
79
|
+
h = OrderedHash.new
|
|
80
|
+
s = "a"
|
|
81
|
+
25.times do
|
|
82
|
+
h[rand.to_s] = s.succ!.dup
|
|
83
|
+
end
|
|
84
|
+
h
|
|
85
|
+
end
|
|
86
|
+
end
|