putio 0.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (527) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +27 -0
  4. data/Rakefile +21 -0
  5. data/Readme.md +32 -0
  6. data/development/ruby/1.8/bin/convert_to_should_syntax +19 -0
  7. data/development/ruby/1.8/bin/edit_json.rb +19 -0
  8. data/development/ruby/1.8/bin/prettify_json.rb +19 -0
  9. data/development/ruby/1.8/cache/crack-0.1.8.gem +0 -0
  10. data/development/ruby/1.8/cache/fakeweb-1.3.0.gem +0 -0
  11. data/development/ruby/1.8/cache/hashie-0.4.0.gem +0 -0
  12. data/development/ruby/1.8/cache/json-1.4.6.gem +0 -0
  13. data/development/ruby/1.8/cache/omg-0.0.6.gem +0 -0
  14. data/development/ruby/1.8/cache/shoulda-2.11.3.gem +0 -0
  15. data/development/ruby/1.8/gems/crack-0.1.8/.gitignore +6 -0
  16. data/development/ruby/1.8/gems/crack-0.1.8/History +25 -0
  17. data/development/ruby/1.8/gems/crack-0.1.8/LICENSE +20 -0
  18. data/development/ruby/1.8/gems/crack-0.1.8/README.rdoc +42 -0
  19. data/development/ruby/1.8/gems/crack-0.1.8/Rakefile +52 -0
  20. data/development/ruby/1.8/gems/crack-0.1.8/crack.gemspec +63 -0
  21. data/development/ruby/1.8/gems/crack-0.1.8/lib/crack/core_extensions.rb +128 -0
  22. data/development/ruby/1.8/gems/crack-0.1.8/lib/crack/json.rb +68 -0
  23. data/development/ruby/1.8/gems/crack-0.1.8/lib/crack/xml.rb +214 -0
  24. data/development/ruby/1.8/gems/crack-0.1.8/lib/crack.rb +8 -0
  25. data/development/ruby/1.8/gems/crack-0.1.8/test/crack_test.rb +4 -0
  26. data/development/ruby/1.8/gems/crack-0.1.8/test/data/twittersearch-firefox.json +1 -0
  27. data/development/ruby/1.8/gems/crack-0.1.8/test/data/twittersearch-ie.json +1 -0
  28. data/development/ruby/1.8/gems/crack-0.1.8/test/hash_test.rb +56 -0
  29. data/development/ruby/1.8/gems/crack-0.1.8/test/json_test.rb +69 -0
  30. data/development/ruby/1.8/gems/crack-0.1.8/test/string_test.rb +31 -0
  31. data/development/ruby/1.8/gems/crack-0.1.8/test/test_helper.rb +12 -0
  32. data/development/ruby/1.8/gems/crack-0.1.8/test/xml_test.rb +489 -0
  33. data/development/ruby/1.8/gems/fakeweb-1.3.0/.autotest +5 -0
  34. data/development/ruby/1.8/gems/fakeweb-1.3.0/.gitignore +7 -0
  35. data/development/ruby/1.8/gems/fakeweb-1.3.0/CHANGELOG +215 -0
  36. data/development/ruby/1.8/gems/fakeweb-1.3.0/LICENSE.txt +19 -0
  37. data/development/ruby/1.8/gems/fakeweb-1.3.0/README.rdoc +189 -0
  38. data/development/ruby/1.8/gems/fakeweb-1.3.0/Rakefile +67 -0
  39. data/development/ruby/1.8/gems/fakeweb-1.3.0/fakeweb.gemspec +126 -0
  40. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fake_web/ext/net_http.rb +72 -0
  41. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fake_web/registry.rb +127 -0
  42. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fake_web/responder.rb +122 -0
  43. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fake_web/response.rb +10 -0
  44. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fake_web/stub_socket.rb +15 -0
  45. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fake_web/utility.rb +87 -0
  46. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fake_web.rb +215 -0
  47. data/development/ruby/1.8/gems/fakeweb-1.3.0/lib/fakeweb.rb +2 -0
  48. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/fixtures/google_response_from_curl +12 -0
  49. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/fixtures/google_response_with_transfer_encoding +17 -0
  50. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/fixtures/google_response_without_transfer_encoding +11 -0
  51. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/fixtures/test_example.txt +1 -0
  52. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/fixtures/test_txt_file +3 -0
  53. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_allow_net_connect.rb +168 -0
  54. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_deprecations.rb +54 -0
  55. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_fake_authentication.rb +92 -0
  56. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_fake_web.rb +590 -0
  57. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_fake_web_open_uri.rb +58 -0
  58. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_helper.rb +90 -0
  59. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_last_request.rb +29 -0
  60. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_missing_open_uri.rb +25 -0
  61. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_missing_pathname.rb +37 -0
  62. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_other_net_http_libraries.rb +36 -0
  63. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_precedence.rb +79 -0
  64. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_query_string.rb +45 -0
  65. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_regexes.rb +157 -0
  66. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_response_headers.rb +79 -0
  67. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_trailing_slashes.rb +53 -0
  68. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/test_utility.rb +83 -0
  69. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/right_http_connection-1.2.4/History.txt +59 -0
  70. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/right_http_connection-1.2.4/Manifest.txt +7 -0
  71. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/right_http_connection-1.2.4/README.txt +54 -0
  72. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/right_http_connection-1.2.4/Rakefile +103 -0
  73. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/right_http_connection-1.2.4/lib/net_fix.rb +160 -0
  74. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/right_http_connection-1.2.4/lib/right_http_connection.rb +435 -0
  75. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/right_http_connection-1.2.4/setup.rb +1585 -0
  76. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/.document +5 -0
  77. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/.gitignore +5 -0
  78. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/LICENSE +20 -0
  79. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/README.rdoc +70 -0
  80. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/Rakefile +62 -0
  81. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/VERSION +1 -0
  82. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/lib/samuel/net_http.rb +10 -0
  83. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/lib/samuel/request.rb +96 -0
  84. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/lib/samuel.rb +52 -0
  85. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/samuel.gemspec +69 -0
  86. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/test/request_test.rb +193 -0
  87. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/test/samuel_test.rb +42 -0
  88. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/test/test_helper.rb +66 -0
  89. data/development/ruby/1.8/gems/fakeweb-1.3.0/test/vendor/samuel-0.2.1/test/thread_test.rb +32 -0
  90. data/development/ruby/1.8/gems/hashie-0.4.0/.document +5 -0
  91. data/development/ruby/1.8/gems/hashie-0.4.0/.gitignore +7 -0
  92. data/development/ruby/1.8/gems/hashie-0.4.0/Gemfile +12 -0
  93. data/development/ruby/1.8/gems/hashie-0.4.0/Gemfile.lock +24 -0
  94. data/development/ruby/1.8/gems/hashie-0.4.0/LICENSE +20 -0
  95. data/development/ruby/1.8/gems/hashie-0.4.0/README.rdoc +119 -0
  96. data/development/ruby/1.8/gems/hashie-0.4.0/Rakefile +47 -0
  97. data/development/ruby/1.8/gems/hashie-0.4.0/VERSION +1 -0
  98. data/development/ruby/1.8/gems/hashie-0.4.0/hashie.gemspec +71 -0
  99. data/development/ruby/1.8/gems/hashie-0.4.0/lib/hashie/clash.rb +86 -0
  100. data/development/ruby/1.8/gems/hashie-0.4.0/lib/hashie/dash.rb +111 -0
  101. data/development/ruby/1.8/gems/hashie-0.4.0/lib/hashie/hash.rb +24 -0
  102. data/development/ruby/1.8/gems/hashie-0.4.0/lib/hashie/hash_extensions.rb +49 -0
  103. data/development/ruby/1.8/gems/hashie-0.4.0/lib/hashie/mash.rb +178 -0
  104. data/development/ruby/1.8/gems/hashie-0.4.0/lib/hashie/trash.rb +55 -0
  105. data/development/ruby/1.8/gems/hashie-0.4.0/lib/hashie.rb +9 -0
  106. data/development/ruby/1.8/gems/hashie-0.4.0/spec/hashie/clash_spec.rb +42 -0
  107. data/development/ruby/1.8/gems/hashie-0.4.0/spec/hashie/dash_spec.rb +156 -0
  108. data/development/ruby/1.8/gems/hashie-0.4.0/spec/hashie/hash_spec.rb +22 -0
  109. data/development/ruby/1.8/gems/hashie-0.4.0/spec/hashie/mash_spec.rb +241 -0
  110. data/development/ruby/1.8/gems/hashie-0.4.0/spec/hashie/trash_spec.rb +70 -0
  111. data/development/ruby/1.8/gems/hashie-0.4.0/spec/spec.opts +3 -0
  112. data/development/ruby/1.8/gems/hashie-0.4.0/spec/spec_helper.rb +13 -0
  113. data/development/ruby/1.8/gems/json-1.4.6/.require_paths +4 -0
  114. data/development/ruby/1.8/gems/json-1.4.6/CHANGES +179 -0
  115. data/development/ruby/1.8/gems/json-1.4.6/COPYING +58 -0
  116. data/development/ruby/1.8/gems/json-1.4.6/GPL +340 -0
  117. data/development/ruby/1.8/gems/json-1.4.6/README +356 -0
  118. data/development/ruby/1.8/gems/json-1.4.6/Rakefile +292 -0
  119. data/development/ruby/1.8/gems/json-1.4.6/TODO +1 -0
  120. data/development/ruby/1.8/gems/json-1.4.6/VERSION +1 -0
  121. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +52 -0
  122. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
  123. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
  124. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
  125. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
  126. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
  127. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
  128. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +261 -0
  129. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
  130. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
  131. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
  132. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
  133. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
  134. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
  135. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +262 -0
  136. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
  137. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
  138. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +82 -0
  139. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +34 -0
  140. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
  141. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
  142. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +81 -0
  143. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
  144. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
  145. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +82 -0
  146. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
  147. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
  148. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +82 -0
  149. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
  150. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
  151. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +82 -0
  152. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/generator2_benchmark.rb +222 -0
  153. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/generator_benchmark.rb +224 -0
  154. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/ohai.json +1216 -0
  155. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/ohai.ruby +1 -0
  156. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/parser2_benchmark.rb +251 -0
  157. data/development/ruby/1.8/gems/json-1.4.6/benchmarks/parser_benchmark.rb +259 -0
  158. data/development/ruby/1.8/gems/json-1.4.6/bin/edit_json.rb +9 -0
  159. data/development/ruby/1.8/gems/json-1.4.6/bin/prettify_json.rb +75 -0
  160. data/development/ruby/1.8/gems/json-1.4.6/data/example.json +1 -0
  161. data/development/ruby/1.8/gems/json-1.4.6/data/index.html +38 -0
  162. data/development/ruby/1.8/gems/json-1.4.6/data/prototype.js +4184 -0
  163. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/generator/Makefile +157 -0
  164. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/generator/extconf.rb +20 -0
  165. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/generator/generator.bundle +0 -0
  166. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/generator/generator.c +1417 -0
  167. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/generator/generator.h +197 -0
  168. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/generator/generator.o +0 -0
  169. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/generator/mkmf.log +10 -0
  170. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/json/ext/generator.bundle +0 -0
  171. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/json/ext/parser.bundle +0 -0
  172. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/Makefile +157 -0
  173. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/extconf.rb +15 -0
  174. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/mkmf.log +10 -0
  175. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/parser.bundle +0 -0
  176. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/parser.c +1935 -0
  177. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/parser.h +71 -0
  178. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/parser.o +0 -0
  179. data/development/ruby/1.8/gems/json-1.4.6/ext/json/ext/parser/parser.rl +792 -0
  180. data/development/ruby/1.8/gems/json-1.4.6/install.rb +26 -0
  181. data/development/ruby/1.8/gems/json-1.4.6/lib/json/Array.xpm +21 -0
  182. data/development/ruby/1.8/gems/json-1.4.6/lib/json/FalseClass.xpm +21 -0
  183. data/development/ruby/1.8/gems/json-1.4.6/lib/json/Hash.xpm +21 -0
  184. data/development/ruby/1.8/gems/json-1.4.6/lib/json/Key.xpm +73 -0
  185. data/development/ruby/1.8/gems/json-1.4.6/lib/json/NilClass.xpm +21 -0
  186. data/development/ruby/1.8/gems/json-1.4.6/lib/json/Numeric.xpm +28 -0
  187. data/development/ruby/1.8/gems/json-1.4.6/lib/json/String.xpm +96 -0
  188. data/development/ruby/1.8/gems/json-1.4.6/lib/json/TrueClass.xpm +21 -0
  189. data/development/ruby/1.8/gems/json-1.4.6/lib/json/add/core.rb +148 -0
  190. data/development/ruby/1.8/gems/json-1.4.6/lib/json/add/rails.rb +58 -0
  191. data/development/ruby/1.8/gems/json-1.4.6/lib/json/common.rb +391 -0
  192. data/development/ruby/1.8/gems/json-1.4.6/lib/json/editor.rb +1371 -0
  193. data/development/ruby/1.8/gems/json-1.4.6/lib/json/ext.rb +15 -0
  194. data/development/ruby/1.8/gems/json-1.4.6/lib/json/json.xpm +1499 -0
  195. data/development/ruby/1.8/gems/json-1.4.6/lib/json/pure/generator.rb +439 -0
  196. data/development/ruby/1.8/gems/json-1.4.6/lib/json/pure/parser.rb +309 -0
  197. data/development/ruby/1.8/gems/json-1.4.6/lib/json/pure.rb +77 -0
  198. data/development/ruby/1.8/gems/json-1.4.6/lib/json/version.rb +8 -0
  199. data/development/ruby/1.8/gems/json-1.4.6/lib/json.rb +10 -0
  200. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail1.json +1 -0
  201. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail10.json +1 -0
  202. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail11.json +1 -0
  203. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail12.json +1 -0
  204. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail13.json +1 -0
  205. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail14.json +1 -0
  206. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail18.json +1 -0
  207. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail19.json +1 -0
  208. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail2.json +1 -0
  209. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail20.json +1 -0
  210. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail21.json +1 -0
  211. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail22.json +1 -0
  212. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail23.json +1 -0
  213. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail24.json +1 -0
  214. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail25.json +1 -0
  215. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail27.json +2 -0
  216. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail28.json +2 -0
  217. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail3.json +1 -0
  218. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail4.json +1 -0
  219. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail5.json +1 -0
  220. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail6.json +1 -0
  221. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail7.json +1 -0
  222. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail8.json +1 -0
  223. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/fail9.json +1 -0
  224. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/pass1.json +56 -0
  225. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/pass15.json +1 -0
  226. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/pass16.json +1 -0
  227. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/pass17.json +1 -0
  228. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/pass2.json +1 -0
  229. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/pass26.json +1 -0
  230. data/development/ruby/1.8/gems/json-1.4.6/tests/fixtures/pass3.json +6 -0
  231. data/development/ruby/1.8/gems/json-1.4.6/tests/test_json.rb +394 -0
  232. data/development/ruby/1.8/gems/json-1.4.6/tests/test_json_addition.rb +162 -0
  233. data/development/ruby/1.8/gems/json-1.4.6/tests/test_json_encoding.rb +68 -0
  234. data/development/ruby/1.8/gems/json-1.4.6/tests/test_json_fixtures.rb +34 -0
  235. data/development/ruby/1.8/gems/json-1.4.6/tests/test_json_generate.rb +181 -0
  236. data/development/ruby/1.8/gems/json-1.4.6/tests/test_json_rails.rb +144 -0
  237. data/development/ruby/1.8/gems/json-1.4.6/tests/test_json_unicode.rb +76 -0
  238. data/development/ruby/1.8/gems/json-1.4.6/tools/fuzz.rb +139 -0
  239. data/development/ruby/1.8/gems/json-1.4.6/tools/server.rb +61 -0
  240. data/development/ruby/1.8/gems/omg-0.0.6/.document +5 -0
  241. data/development/ruby/1.8/gems/omg-0.0.6/.gitignore +21 -0
  242. data/development/ruby/1.8/gems/omg-0.0.6/LICENSE +20 -0
  243. data/development/ruby/1.8/gems/omg-0.0.6/README.rdoc +35 -0
  244. data/development/ruby/1.8/gems/omg-0.0.6/Rakefile +52 -0
  245. data/development/ruby/1.8/gems/omg-0.0.6/TODO +1 -0
  246. data/development/ruby/1.8/gems/omg-0.0.6/VERSION +1 -0
  247. data/development/ruby/1.8/gems/omg-0.0.6/lib/omg.rb +43 -0
  248. data/development/ruby/1.8/gems/omg-0.0.6/omg.gemspec +53 -0
  249. data/development/ruby/1.8/gems/omg-0.0.6/test/helper.rb +10 -0
  250. data/development/ruby/1.8/gems/omg-0.0.6/test/test_omg.rb +7 -0
  251. data/development/ruby/1.8/gems/shoulda-2.11.3/CONTRIBUTION_GUIDELINES.rdoc +10 -0
  252. data/development/ruby/1.8/gems/shoulda-2.11.3/MIT-LICENSE +22 -0
  253. data/development/ruby/1.8/gems/shoulda-2.11.3/README.rdoc +154 -0
  254. data/development/ruby/1.8/gems/shoulda-2.11.3/Rakefile +70 -0
  255. data/development/ruby/1.8/gems/shoulda-2.11.3/bin/convert_to_should_syntax +42 -0
  256. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/macros.rb +221 -0
  257. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +112 -0
  258. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +74 -0
  259. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/redirect_to_matcher.rb +62 -0
  260. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/render_template_matcher.rb +54 -0
  261. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +99 -0
  262. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +74 -0
  263. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +85 -0
  264. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
  265. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/set_session_matcher.rb +98 -0
  266. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +100 -0
  267. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller/matchers.rb +39 -0
  268. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_controller.rb +34 -0
  269. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_mailer/assertions.rb +42 -0
  270. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_mailer/matchers/have_sent_email.rb +110 -0
  271. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_mailer/matchers.rb +22 -0
  272. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/action_mailer.rb +13 -0
  273. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/assertions.rb +69 -0
  274. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/helpers.rb +32 -0
  275. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/macros.rb +457 -0
  276. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
  277. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/allow_value_matcher.rb +110 -0
  278. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
  279. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
  280. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
  281. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
  282. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +112 -0
  283. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
  284. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
  285. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +65 -0
  286. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
  287. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
  288. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
  289. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
  290. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record/matchers.rb +42 -0
  291. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/active_record.rb +16 -0
  292. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/assertions.rb +79 -0
  293. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/autoload_macros.rb +46 -0
  294. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/context.rb +433 -0
  295. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/helpers.rb +8 -0
  296. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/integrations/rspec.rb +13 -0
  297. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/integrations/rspec2.rb +22 -0
  298. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/integrations/test_unit.rb +22 -0
  299. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/macros.rb +161 -0
  300. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/private_helpers.rb +13 -0
  301. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/proc_extensions.rb +14 -0
  302. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/rails.rb +8 -0
  303. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/tasks/list_tests.rake +29 -0
  304. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
  305. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/tasks.rb +3 -0
  306. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/version.rb +4 -0
  307. data/development/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda.rb +9 -0
  308. data/development/ruby/1.8/gems/shoulda-2.11.3/rails/init.rb +8 -0
  309. data/development/ruby/1.8/gems/shoulda-2.11.3/test/README +36 -0
  310. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fail_macros.rb +55 -0
  311. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fixtures/addresses.yml +3 -0
  312. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fixtures/friendships.yml +0 -0
  313. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fixtures/posts.yml +5 -0
  314. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fixtures/products.yml +0 -0
  315. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fixtures/taggings.yml +0 -0
  316. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fixtures/tags.yml +9 -0
  317. data/development/ruby/1.8/gems/shoulda-2.11.3/test/fixtures/users.yml +6 -0
  318. data/development/ruby/1.8/gems/shoulda-2.11.3/test/functional/posts_controller_test.rb +121 -0
  319. data/development/ruby/1.8/gems/shoulda-2.11.3/test/functional/users_controller_test.rb +19 -0
  320. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/action_mailer/have_sent_email_test.rb +70 -0
  321. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +74 -0
  322. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/allow_value_matcher_test.rb +64 -0
  323. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/association_matcher_test.rb +263 -0
  324. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +81 -0
  325. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
  326. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
  327. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/have_db_index_matcher_test.rb +91 -0
  328. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
  329. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
  330. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/validate_format_of_matcher_test.rb +39 -0
  331. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
  332. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  333. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  334. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/assign_to_matcher_test.rb +45 -0
  335. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/filter_param_matcher_test.rb +40 -0
  336. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/redirect_to_matcher_test.rb +37 -0
  337. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/render_template_matcher_test.rb +37 -0
  338. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/render_with_layout_matcher_test.rb +47 -0
  339. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/respond_with_content_type_matcher_test.rb +32 -0
  340. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/respond_with_matcher_test.rb +96 -0
  341. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/route_matcher_test.rb +75 -0
  342. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/set_session_matcher_test.rb +48 -0
  343. data/development/ruby/1.8/gems/shoulda-2.11.3/test/matchers/controller/set_the_flash_matcher.rb +95 -0
  344. data/development/ruby/1.8/gems/shoulda-2.11.3/test/other/autoload_macro_test.rb +18 -0
  345. data/development/ruby/1.8/gems/shoulda-2.11.3/test/other/context_test.rb +372 -0
  346. data/development/ruby/1.8/gems/shoulda-2.11.3/test/other/convert_to_should_syntax_test.rb +63 -0
  347. data/development/ruby/1.8/gems/shoulda-2.11.3/test/other/helpers_test.rb +317 -0
  348. data/development/ruby/1.8/gems/shoulda-2.11.3/test/other/private_helpers_test.rb +32 -0
  349. data/development/ruby/1.8/gems/shoulda-2.11.3/test/other/should_test.rb +271 -0
  350. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_model_builder.rb +130 -0
  351. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/controllers/application_controller.rb +22 -0
  352. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/controllers/posts_controller.rb +87 -0
  353. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/controllers/users_controller.rb +84 -0
  354. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/helpers/application_helper.rb +3 -0
  355. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/helpers/posts_helper.rb +2 -0
  356. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/helpers/users_helper.rb +2 -0
  357. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/address.rb +7 -0
  358. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/flea.rb +11 -0
  359. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/friendship.rb +4 -0
  360. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/notifier.rb +8 -0
  361. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/pets/cat.rb +7 -0
  362. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/pets/dog.rb +10 -0
  363. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/post.rb +12 -0
  364. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/product.rb +12 -0
  365. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/profile.rb +2 -0
  366. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/registration.rb +2 -0
  367. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/tag.rb +8 -0
  368. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/tagging.rb +4 -0
  369. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/treat.rb +3 -0
  370. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/models/user.rb +32 -0
  371. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/layouts/posts.rhtml +19 -0
  372. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/layouts/users.rhtml +17 -0
  373. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/layouts/wide.html.erb +1 -0
  374. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/notifier/the_email.html.erb +1 -0
  375. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/posts/edit.rhtml +27 -0
  376. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/posts/index.rhtml +25 -0
  377. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/posts/new.rhtml +26 -0
  378. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/posts/show.rhtml +18 -0
  379. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/users/edit.rhtml +22 -0
  380. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/users/index.rhtml +22 -0
  381. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/users/new.rhtml +21 -0
  382. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/app/views/users/show.rhtml +13 -0
  383. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/config/boot.rb +110 -0
  384. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/config/database.yml +4 -0
  385. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/config/environment.rb +17 -0
  386. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/config/environments/test.rb +23 -0
  387. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/config/initializers/new_rails_defaults.rb +15 -0
  388. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/config/initializers/shoulda.rb +8 -0
  389. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/config/routes.rb +6 -0
  390. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/001_create_users.rb +19 -0
  391. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/002_create_posts.rb +13 -0
  392. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/003_create_taggings.rb +12 -0
  393. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/004_create_tags.rb +11 -0
  394. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/005_create_dogs.rb +12 -0
  395. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/006_create_addresses.rb +14 -0
  396. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/007_create_fleas.rb +11 -0
  397. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  398. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/009_create_products.rb +17 -0
  399. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/010_create_friendships.rb +14 -0
  400. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/011_create_treats.rb +12 -0
  401. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/20090506203502_create_profiles.rb +12 -0
  402. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/20090506203536_create_registrations.rb +14 -0
  403. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/migrate/20090513104502_create_cats.rb +12 -0
  404. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/db/schema.rb +0 -0
  405. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/log/test.log +50381 -0
  406. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/public/404.html +30 -0
  407. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/public/422.html +30 -0
  408. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/public/500.html +30 -0
  409. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/script/console +3 -0
  410. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/script/generate +3 -0
  411. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/test/shoulda_macros/custom_macro.rb +6 -0
  412. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  413. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  414. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails2_test_helper.rb +6 -0
  415. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_model_builder.rb +118 -0
  416. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/Gemfile +28 -0
  417. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/README +244 -0
  418. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/Rakefile +10 -0
  419. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/controllers/application_controller.rb +22 -0
  420. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/controllers/posts_controller.rb +87 -0
  421. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/controllers/users_controller.rb +82 -0
  422. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/helpers/application_helper.rb +2 -0
  423. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/address.rb +7 -0
  424. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/flea.rb +11 -0
  425. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/friendship.rb +4 -0
  426. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/notifier.rb +8 -0
  427. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/pets/cat.rb +7 -0
  428. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/pets/dog.rb +10 -0
  429. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/post.rb +12 -0
  430. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/product.rb +12 -0
  431. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/profile.rb +2 -0
  432. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/registration.rb +2 -0
  433. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/tag.rb +8 -0
  434. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/tagging.rb +4 -0
  435. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/treat.rb +3 -0
  436. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/models/user.rb +32 -0
  437. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/layouts/application.html.erb +14 -0
  438. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/layouts/posts.rhtml +19 -0
  439. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/layouts/users.rhtml +17 -0
  440. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/layouts/wide.html.erb +1 -0
  441. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/notifier/the_email.html.erb +1 -0
  442. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/posts/edit.rhtml +27 -0
  443. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/posts/index.rhtml +25 -0
  444. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/posts/new.rhtml +24 -0
  445. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/posts/show.rhtml +18 -0
  446. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/users/edit.rhtml +22 -0
  447. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/users/index.rhtml +22 -0
  448. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/users/new.rhtml +21 -0
  449. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/app/views/users/show.rhtml +13 -0
  450. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/application.rb +46 -0
  451. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/boot.rb +6 -0
  452. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/database.yml +22 -0
  453. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/environment.rb +5 -0
  454. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/environments/development.rb +19 -0
  455. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/environments/production.rb +42 -0
  456. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/environments/test.rb +32 -0
  457. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/initializers/backtrace_silencers.rb +7 -0
  458. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/initializers/inflections.rb +10 -0
  459. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/initializers/mime_types.rb +5 -0
  460. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/initializers/secret_token.rb +7 -0
  461. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/initializers/session_store.rb +8 -0
  462. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/locales/en.yml +5 -0
  463. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config/routes.rb +4 -0
  464. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/config.ru +4 -0
  465. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/001_create_users.rb +19 -0
  466. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/002_create_posts.rb +13 -0
  467. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/003_create_taggings.rb +12 -0
  468. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/004_create_tags.rb +11 -0
  469. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/005_create_dogs.rb +12 -0
  470. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/006_create_addresses.rb +14 -0
  471. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/007_create_fleas.rb +11 -0
  472. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  473. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/009_create_products.rb +17 -0
  474. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/010_create_friendships.rb +14 -0
  475. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/011_create_treats.rb +12 -0
  476. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/20090506203502_create_profiles.rb +12 -0
  477. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/20090506203536_create_registrations.rb +14 -0
  478. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/migrate/20090513104502_create_cats.rb +12 -0
  479. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/seeds.rb +7 -0
  480. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/db/test.sqlite3 +0 -0
  481. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/log/test.log +10834 -0
  482. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/404.html +26 -0
  483. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/422.html +26 -0
  484. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/500.html +26 -0
  485. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/favicon.ico +0 -0
  486. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/images/rails.png +0 -0
  487. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/index.html +279 -0
  488. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/javascripts/application.js +2 -0
  489. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/javascripts/controls.js +965 -0
  490. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/javascripts/dragdrop.js +974 -0
  491. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/javascripts/effects.js +1123 -0
  492. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/javascripts/prototype.js +4874 -0
  493. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/javascripts/rails.js +118 -0
  494. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/public/robots.txt +5 -0
  495. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/script/rails +9 -0
  496. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/test/performance/browsing_test.rb +9 -0
  497. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_root/test/test_helper.rb +13 -0
  498. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rails3_test_helper.rb +6 -0
  499. data/development/ruby/1.8/gems/shoulda-2.11.3/test/rspec_test.rb +207 -0
  500. data/development/ruby/1.8/gems/shoulda-2.11.3/test/test_helper.rb +36 -0
  501. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/address_test.rb +10 -0
  502. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/cat_test.rb +7 -0
  503. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/dog_test.rb +9 -0
  504. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/flea_test.rb +14 -0
  505. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/friendship_test.rb +6 -0
  506. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/post_test.rb +15 -0
  507. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/product_test.rb +23 -0
  508. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/tag_test.rb +11 -0
  509. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/tagging_test.rb +6 -0
  510. data/development/ruby/1.8/gems/shoulda-2.11.3/test/unit/user_test.rb +46 -0
  511. data/development/ruby/1.8/specifications/crack-0.1.8.gemspec +30 -0
  512. data/development/ruby/1.8/specifications/fakeweb-1.3.0.gemspec +34 -0
  513. data/development/ruby/1.8/specifications/hashie-0.4.0.gemspec +33 -0
  514. data/development/ruby/1.8/specifications/json-1.4.6.gemspec +34 -0
  515. data/development/ruby/1.8/specifications/omg-0.0.6.gemspec +30 -0
  516. data/development/ruby/1.8/specifications/shoulda-2.11.3.gemspec +32 -0
  517. data/lib/putio/client.rb +74 -0
  518. data/lib/putio/putio.rb +5 -0
  519. data/lib/putio.rb +4 -0
  520. data/putio.gemspec +25 -0
  521. data/test/fixtures/user_friends.json +1 -0
  522. data/test/fixtures/user_info.json +1 -0
  523. data/test/test_helper.rb +19 -0
  524. data/test/units/client_test.rb +11 -0
  525. data/test/units/putio_test.rb +11 -0
  526. data/test/units/user_test.rb +39 -0
  527. metadata +675 -0
@@ -0,0 +1,1417 @@
1
+ #include "generator.h"
2
+
3
+ #ifdef HAVE_RUBY_ENCODING_H
4
+ static VALUE CEncoding_UTF_8;
5
+ static ID i_encoding, i_encode;
6
+ #endif
7
+
8
+ static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
9
+ mHash, mArray, mFixnum, mBignum, mFloat, mString, mString_Extend,
10
+ mTrueClass, mFalseClass, mNilClass, eGeneratorError,
11
+ eNestingError, CRegexp_MULTILINE, CJSON_SAFE_STATE_PROTOTYPE,
12
+ i_SAFE_STATE_PROTOTYPE;
13
+
14
+ static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
15
+ i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
16
+ i_pack, i_unpack, i_create_id, i_extend, i_key_p, i_aref, i_send,
17
+ i_respond_to_p, i_match, i_keys, i_depth, i_dup;
18
+
19
+ /*
20
+ * Copyright 2001-2004 Unicode, Inc.
21
+ *
22
+ * Disclaimer
23
+ *
24
+ * This source code is provided as is by Unicode, Inc. No claims are
25
+ * made as to fitness for any particular purpose. No warranties of any
26
+ * kind are expressed or implied. The recipient agrees to determine
27
+ * applicability of information provided. If this file has been
28
+ * purchased on magnetic or optical media from Unicode, Inc., the
29
+ * sole remedy for any claim will be exchange of defective media
30
+ * within 90 days of receipt.
31
+ *
32
+ * Limitations on Rights to Redistribute This Code
33
+ *
34
+ * Unicode, Inc. hereby grants the right to freely use the information
35
+ * supplied in this file in the creation of products supporting the
36
+ * Unicode Standard, and to make copies of this file in any form
37
+ * for internal or external distribution as long as this notice
38
+ * remains attached.
39
+ */
40
+
41
+ /*
42
+ * Index into the table below with the first byte of a UTF-8 sequence to
43
+ * get the number of trailing bytes that are supposed to follow it.
44
+ * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is
45
+ * left as-is for anyone who may want to do such conversion, which was
46
+ * allowed in earlier algorithms.
47
+ */
48
+ static const char trailingBytesForUTF8[256] = {
49
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
50
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
51
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
52
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
53
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
54
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
55
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
56
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
57
+ };
58
+
59
+ /*
60
+ * Magic values subtracted from a buffer value during UTF8 conversion.
61
+ * This table contains as many values as there might be trailing bytes
62
+ * in a UTF-8 sequence.
63
+ */
64
+ static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
65
+ 0x03C82080UL, 0xFA082080UL, 0x82082080UL };
66
+
67
+ /*
68
+ * Utility routine to tell whether a sequence of bytes is legal UTF-8.
69
+ * This must be called with the length pre-determined by the first byte.
70
+ * If not calling this from ConvertUTF8to*, then the length can be set by:
71
+ * length = trailingBytesForUTF8[*source]+1;
72
+ * and the sequence is illegal right away if there aren't that many bytes
73
+ * available.
74
+ * If presented with a length > 4, this returns 0. The Unicode
75
+ * definition of UTF-8 goes up to 4-byte sequences.
76
+ */
77
+ static unsigned char isLegalUTF8(const UTF8 *source, int length)
78
+ {
79
+ UTF8 a;
80
+ const UTF8 *srcptr = source+length;
81
+ switch (length) {
82
+ default: return 0;
83
+ /* Everything else falls through when "1"... */
84
+ case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
85
+ case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
86
+ case 2: if ((a = (*--srcptr)) > 0xBF) return 0;
87
+
88
+ switch (*source) {
89
+ /* no fall-through in this inner switch */
90
+ case 0xE0: if (a < 0xA0) return 0; break;
91
+ case 0xED: if (a > 0x9F) return 0; break;
92
+ case 0xF0: if (a < 0x90) return 0; break;
93
+ case 0xF4: if (a > 0x8F) return 0; break;
94
+ default: if (a < 0x80) return 0;
95
+ }
96
+
97
+ case 1: if (*source >= 0x80 && *source < 0xC2) return 0;
98
+ }
99
+ if (*source > 0xF4) return 0;
100
+ return 1;
101
+ }
102
+
103
+ /* Escapes the UTF16 character and stores the result in the buffer buf. */
104
+ static void unicode_escape(char *buf, UTF16 character)
105
+ {
106
+ const char *digits = "0123456789abcdef";
107
+
108
+ buf[2] = digits[character >> 12];
109
+ buf[3] = digits[(character >> 8) & 0xf];
110
+ buf[4] = digits[(character >> 4) & 0xf];
111
+ buf[5] = digits[character & 0xf];
112
+ }
113
+
114
+ /* Escapes the UTF16 character and stores the result in the buffer buf, then
115
+ * the buffer buf іs appended to the FBuffer buffer. */
116
+ static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16
117
+ character)
118
+ {
119
+ unicode_escape(buf, character);
120
+ fbuffer_append(buffer, buf, 6);
121
+ }
122
+
123
+ /* Converts string to a JSON string in FBuffer buffer, where all but the ASCII
124
+ * and control characters are JSON escaped. */
125
+ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string)
126
+ {
127
+ const UTF8 *source = (UTF8 *) RSTRING_PTR(string);
128
+ const UTF8 *sourceEnd = source + RSTRING_LEN(string);
129
+ char buf[6] = { '\\', 'u' };
130
+
131
+ while (source < sourceEnd) {
132
+ UTF32 ch = 0;
133
+ unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
134
+ if (source + extraBytesToRead >= sourceEnd) {
135
+ rb_raise(rb_path2class("JSON::GeneratorError"),
136
+ "partial character in source, but hit end");
137
+ }
138
+ if (!isLegalUTF8(source, extraBytesToRead+1)) {
139
+ rb_raise(rb_path2class("JSON::GeneratorError"),
140
+ "source sequence is illegal/malformed utf-8");
141
+ }
142
+ /*
143
+ * The cases all fall through. See "Note A" below.
144
+ */
145
+ switch (extraBytesToRead) {
146
+ case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
147
+ case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
148
+ case 3: ch += *source++; ch <<= 6;
149
+ case 2: ch += *source++; ch <<= 6;
150
+ case 1: ch += *source++; ch <<= 6;
151
+ case 0: ch += *source++;
152
+ }
153
+ ch -= offsetsFromUTF8[extraBytesToRead];
154
+
155
+ if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
156
+ /* UTF-16 surrogate values are illegal in UTF-32 */
157
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
158
+ #if UNI_STRICT_CONVERSION
159
+ source -= (extraBytesToRead+1); /* return to the illegal value itself */
160
+ rb_raise(rb_path2class("JSON::GeneratorError"),
161
+ "source sequence is illegal/malformed utf-8");
162
+ #else
163
+ unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR);
164
+ #endif
165
+ } else {
166
+ /* normal case */
167
+ if (ch >= 0x20 && ch <= 0x7f) {
168
+ switch (ch) {
169
+ case '\\':
170
+ fbuffer_append(buffer, "\\\\", 2);
171
+ break;
172
+ case '"':
173
+ fbuffer_append(buffer, "\\\"", 2);
174
+ break;
175
+ default:
176
+ fbuffer_append_char(buffer, (char)ch);
177
+ break;
178
+ }
179
+ } else {
180
+ switch (ch) {
181
+ case '\n':
182
+ fbuffer_append(buffer, "\\n", 2);
183
+ break;
184
+ case '\r':
185
+ fbuffer_append(buffer, "\\r", 2);
186
+ break;
187
+ case '\t':
188
+ fbuffer_append(buffer, "\\t", 2);
189
+ break;
190
+ case '\f':
191
+ fbuffer_append(buffer, "\\f", 2);
192
+ break;
193
+ case '\b':
194
+ fbuffer_append(buffer, "\\b", 2);
195
+ break;
196
+ default:
197
+ unicode_escape_to_buffer(buffer, buf, (UTF16) ch);
198
+ break;
199
+ }
200
+ }
201
+ }
202
+ } else if (ch > UNI_MAX_UTF16) {
203
+ #if UNI_STRICT_CONVERSION
204
+ source -= (extraBytesToRead+1); /* return to the start */
205
+ rb_raise(rb_path2class("JSON::GeneratorError"),
206
+ "source sequence is illegal/malformed utf8");
207
+ #else
208
+ unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR);
209
+ #endif
210
+ } else {
211
+ /* target is a character in range 0xFFFF - 0x10FFFF. */
212
+ ch -= halfBase;
213
+ unicode_escape_to_buffer(buffer, buf, (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START));
214
+ unicode_escape_to_buffer(buffer, buf, (UTF16)((ch & halfMask) + UNI_SUR_LOW_START));
215
+ }
216
+ }
217
+ }
218
+
219
+ /* Converts string to a JSON string in FBuffer buffer, where only the
220
+ * characters required by the JSON standard are JSON escaped. The remaining
221
+ * characters (should be UTF8) are just passed through and appended to the
222
+ * result. */
223
+ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string)
224
+ {
225
+ const char *ptr = RSTRING_PTR(string), *p;
226
+ int len = RSTRING_LEN(string), start = 0, end = 0;
227
+ const char *escape = NULL;
228
+ int escape_len;
229
+ unsigned char c;
230
+ char buf[6] = { '\\', 'u' };
231
+
232
+ for (start = 0, end = 0; end < len;) {
233
+ p = ptr + end;
234
+ c = (unsigned char) *p;
235
+ if (c < 0x20) {
236
+ switch (c) {
237
+ case '\n':
238
+ escape = "\\n";
239
+ escape_len = 2;
240
+ break;
241
+ case '\r':
242
+ escape = "\\r";
243
+ escape_len = 2;
244
+ break;
245
+ case '\t':
246
+ escape = "\\t";
247
+ escape_len = 2;
248
+ break;
249
+ case '\f':
250
+ escape = "\\f";
251
+ escape_len = 2;
252
+ break;
253
+ case '\b':
254
+ escape = "\\b";
255
+ escape_len = 2;
256
+ break;
257
+ default:
258
+ unicode_escape(buf, (UTF16) *p);
259
+ escape = buf;
260
+ escape_len = 6;
261
+ break;
262
+ }
263
+ } else {
264
+ switch (c) {
265
+ case '\\':
266
+ escape = "\\\\";
267
+ escape_len = 2;
268
+ break;
269
+ case '"':
270
+ escape = "\\\"";
271
+ escape_len = 2;
272
+ break;
273
+ default:
274
+ end++;
275
+ continue;
276
+ break;
277
+ }
278
+ }
279
+ fbuffer_append(buffer, ptr + start, end - start);
280
+ fbuffer_append(buffer, escape, escape_len);
281
+ start = ++end;
282
+ escape = NULL;
283
+ }
284
+ fbuffer_append(buffer, ptr + start, end - start);
285
+ }
286
+
287
+ static char *fstrndup(const char *ptr, int len) {
288
+ char *result;
289
+ if (len <= 0) return NULL;
290
+ result = ALLOC_N(char, len);
291
+ memccpy(result, ptr, 0, len);
292
+ return result;
293
+ }
294
+
295
+ /* fbuffer implementation */
296
+
297
+ static FBuffer *fbuffer_alloc()
298
+ {
299
+ FBuffer *fb = ALLOC(FBuffer);
300
+ memset((void *) fb, 0, sizeof(FBuffer));
301
+ fb->initial_length = FBUFFER_INITIAL_LENGTH;
302
+ return fb;
303
+ }
304
+
305
+ static FBuffer *fbuffer_alloc_with_length(unsigned int initial_length)
306
+ {
307
+ FBuffer *fb;
308
+ assert(initial_length > 0);
309
+ fb = ALLOC(FBuffer);
310
+ memset((void *) fb, 0, sizeof(FBuffer));
311
+ fb->initial_length = initial_length;
312
+ return fb;
313
+ }
314
+
315
+ static void fbuffer_free(FBuffer *fb)
316
+ {
317
+ if (fb->ptr) ruby_xfree(fb->ptr);
318
+ ruby_xfree(fb);
319
+ }
320
+
321
+ static void fbuffer_free_only_buffer(FBuffer *fb)
322
+ {
323
+ ruby_xfree(fb);
324
+ }
325
+
326
+ static void fbuffer_clear(FBuffer *fb)
327
+ {
328
+ fb->len = 0;
329
+ }
330
+
331
+ static void fbuffer_inc_capa(FBuffer *fb, unsigned int requested)
332
+ {
333
+ unsigned int required;
334
+
335
+ if (!fb->ptr) {
336
+ fb->ptr = ALLOC_N(char, fb->initial_length);
337
+ fb->capa = fb->initial_length;
338
+ }
339
+
340
+ for (required = fb->capa; requested > required - fb->len; required <<= 1);
341
+
342
+ if (required > fb->capa) {
343
+ REALLOC_N(fb->ptr, char, required);
344
+ fb->capa = required;
345
+ }
346
+ }
347
+
348
+ static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned int len)
349
+ {
350
+ if (len > 0) {
351
+ fbuffer_inc_capa(fb, len);
352
+ MEMCPY(fb->ptr + fb->len, newstr, char, len);
353
+ fb->len += len;
354
+ }
355
+ }
356
+
357
+ static void fbuffer_append_char(FBuffer *fb, char newchr)
358
+ {
359
+ fbuffer_inc_capa(fb, 1);
360
+ *(fb->ptr + fb->len) = newchr;
361
+ fb->len++;
362
+ }
363
+
364
+ static void freverse(char *start, char *end)
365
+ {
366
+ char c;
367
+
368
+ while (end > start) {
369
+ c = *end, *end-- = *start, *start++ = c;
370
+ }
371
+ }
372
+
373
+ static int fltoa(long number, char *buf)
374
+ {
375
+ static char digits[] = "0123456789";
376
+ long sign = number;
377
+ char* tmp = buf;
378
+
379
+ if (sign < 0) number = -number;
380
+ do *tmp++ = digits[number % 10]; while (number /= 10);
381
+ if (sign < 0) *tmp++ = '-';
382
+ freverse(buf, tmp - 1);
383
+ return tmp - buf;
384
+ }
385
+
386
+ static void fbuffer_append_long(FBuffer *fb, long number)
387
+ {
388
+ char buf[20];
389
+ int len = fltoa(number, buf);
390
+ fbuffer_append(fb, buf, len);
391
+ }
392
+
393
+ static FBuffer *fbuffer_dup(FBuffer *fb)
394
+ {
395
+ int len = fb->len;
396
+ FBuffer *result;
397
+
398
+ if (len > 0) {
399
+ result = fbuffer_alloc_with_length(len);
400
+ fbuffer_append(result, FBUFFER_PAIR(fb));
401
+ } else {
402
+ result = fbuffer_alloc();
403
+ }
404
+ return result;
405
+ }
406
+
407
+ /*
408
+ * Document-module: JSON::Ext::Generator
409
+ *
410
+ * This is the JSON generator implemented as a C extension. It can be
411
+ * configured to be used by setting
412
+ *
413
+ * JSON.generator = JSON::Ext::Generator
414
+ *
415
+ * with the method generator= in JSON.
416
+ *
417
+ */
418
+
419
+ /*
420
+ * call-seq: to_json(state = nil)
421
+ *
422
+ * Returns a JSON string containing a JSON object, that is generated from
423
+ * this Hash instance.
424
+ * _state_ is a JSON::State object, that can also be used to configure the
425
+ * produced JSON string output further.
426
+ */
427
+ static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self)
428
+ {
429
+ GENERATE_JSON(object);
430
+ }
431
+
432
+ /*
433
+ * call-seq: to_json(state = nil)
434
+ *
435
+ * Returns a JSON string containing a JSON array, that is generated from
436
+ * this Array instance.
437
+ * _state_ is a JSON::State object, that can also be used to configure the
438
+ * produced JSON string output further.
439
+ */
440
+ static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self) {
441
+ GENERATE_JSON(array);
442
+ }
443
+
444
+ /*
445
+ * call-seq: to_json(*)
446
+ *
447
+ * Returns a JSON string representation for this Integer number.
448
+ */
449
+ static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self)
450
+ {
451
+ GENERATE_JSON(fixnum);
452
+ }
453
+
454
+ /*
455
+ * call-seq: to_json(*)
456
+ *
457
+ * Returns a JSON string representation for this Integer number.
458
+ */
459
+ static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self)
460
+ {
461
+ GENERATE_JSON(bignum);
462
+ }
463
+
464
+ /*
465
+ * call-seq: to_json(*)
466
+ *
467
+ * Returns a JSON string representation for this Float number.
468
+ */
469
+ static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self)
470
+ {
471
+ GENERATE_JSON(float);
472
+ }
473
+
474
+ /*
475
+ * call-seq: String.included(modul)
476
+ *
477
+ * Extends _modul_ with the String::Extend module.
478
+ */
479
+ static VALUE mString_included_s(VALUE self, VALUE modul) {
480
+ VALUE result = rb_funcall(modul, i_extend, 1, mString_Extend);
481
+ return result;
482
+ }
483
+
484
+ /*
485
+ * call-seq: to_json(*)
486
+ *
487
+ * This string should be encoded with UTF-8 A call to this method
488
+ * returns a JSON string encoded with UTF16 big endian characters as
489
+ * \u????.
490
+ */
491
+ static VALUE mString_to_json(int argc, VALUE *argv, VALUE self)
492
+ {
493
+ GENERATE_JSON(string);
494
+ }
495
+
496
+ /*
497
+ * call-seq: to_json_raw_object()
498
+ *
499
+ * This method creates a raw object hash, that can be nested into
500
+ * other data structures and will be generated as a raw string. This
501
+ * method should be used, if you want to convert raw strings to JSON
502
+ * instead of UTF-8 strings, e. g. binary data.
503
+ */
504
+ static VALUE mString_to_json_raw_object(VALUE self)
505
+ {
506
+ VALUE ary;
507
+ VALUE result = rb_hash_new();
508
+ rb_hash_aset(result, rb_funcall(mJSON, i_create_id, 0), rb_class_name(rb_obj_class(self)));
509
+ ary = rb_funcall(self, i_unpack, 1, rb_str_new2("C*"));
510
+ rb_hash_aset(result, rb_str_new2("raw"), ary);
511
+ return result;
512
+ }
513
+
514
+ /*
515
+ * call-seq: to_json_raw(*args)
516
+ *
517
+ * This method creates a JSON text from the result of a call to
518
+ * to_json_raw_object of this String.
519
+ */
520
+ static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self)
521
+ {
522
+ VALUE obj = mString_to_json_raw_object(self);
523
+ Check_Type(obj, T_HASH);
524
+ return mHash_to_json(argc, argv, obj);
525
+ }
526
+
527
+ /*
528
+ * call-seq: json_create(o)
529
+ *
530
+ * Raw Strings are JSON Objects (the raw bytes are stored in an array for the
531
+ * key "raw"). The Ruby String can be created by this module method.
532
+ */
533
+ static VALUE mString_Extend_json_create(VALUE self, VALUE o)
534
+ {
535
+ VALUE ary;
536
+ Check_Type(o, T_HASH);
537
+ ary = rb_hash_aref(o, rb_str_new2("raw"));
538
+ return rb_funcall(ary, i_pack, 1, rb_str_new2("C*"));
539
+ }
540
+
541
+ /*
542
+ * call-seq: to_json(*)
543
+ *
544
+ * Returns a JSON string for true: 'true'.
545
+ */
546
+ static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self)
547
+ {
548
+ GENERATE_JSON(true);
549
+ }
550
+
551
+ /*
552
+ * call-seq: to_json(*)
553
+ *
554
+ * Returns a JSON string for false: 'false'.
555
+ */
556
+ static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self)
557
+ {
558
+ GENERATE_JSON(false);
559
+ }
560
+
561
+ /*
562
+ * call-seq: to_json(*)
563
+ *
564
+ */
565
+ static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self)
566
+ {
567
+ GENERATE_JSON(null);
568
+ }
569
+
570
+ /*
571
+ * call-seq: to_json(*)
572
+ *
573
+ * Converts this object to a string (calling #to_s), converts
574
+ * it to a JSON string, and returns the result. This is a fallback, if no
575
+ * special method #to_json was defined for some object.
576
+ */
577
+ static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self)
578
+ {
579
+ VALUE state;
580
+ VALUE string = rb_funcall(self, i_to_s, 0);
581
+ rb_scan_args(argc, argv, "01", &state);
582
+ Check_Type(string, T_STRING);
583
+ state = cState_from_state_s(cState, state);
584
+ return cState_partial_generate(state, string);
585
+ }
586
+
587
+ static void State_free(JSON_Generator_State *state)
588
+ {
589
+ if (state->indent) ruby_xfree(state->indent);
590
+ if (state->space) ruby_xfree(state->space);
591
+ if (state->space_before) ruby_xfree(state->space_before);
592
+ if (state->object_nl) ruby_xfree(state->object_nl);
593
+ if (state->array_nl) ruby_xfree(state->array_nl);
594
+ if (state->array_delim) fbuffer_free(state->array_delim);
595
+ if (state->object_delim) fbuffer_free(state->object_delim);
596
+ if (state->object_delim2) fbuffer_free(state->object_delim2);
597
+ ruby_xfree(state);
598
+ }
599
+
600
+ static JSON_Generator_State *State_allocate()
601
+ {
602
+ JSON_Generator_State *state = ALLOC(JSON_Generator_State);
603
+ MEMZERO(state, JSON_Generator_State, 1);
604
+ return state;
605
+ }
606
+
607
+ static VALUE cState_s_allocate(VALUE klass)
608
+ {
609
+ JSON_Generator_State *state = State_allocate();
610
+ return Data_Wrap_Struct(klass, NULL, State_free, state);
611
+ }
612
+
613
+ /*
614
+ * call-seq: configure(opts)
615
+ *
616
+ * Configure this State instance with the Hash _opts_, and return
617
+ * itself.
618
+ */
619
+ static VALUE cState_configure(VALUE self, VALUE opts)
620
+ {
621
+ VALUE tmp;
622
+ GET_STATE(self);
623
+ tmp = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
624
+ if (NIL_P(tmp)) tmp = rb_convert_type(opts, T_HASH, "Hash", "to_h");
625
+ if (NIL_P(tmp)) {
626
+ rb_raise(rb_eArgError, "opts has to be hash like or convertable into a hash");
627
+ }
628
+ opts = tmp;
629
+ tmp = rb_hash_aref(opts, ID2SYM(i_indent));
630
+ if (RTEST(tmp)) {
631
+ int len;
632
+ Check_Type(tmp, T_STRING);
633
+ len = RSTRING_LEN(tmp);
634
+ state->indent = fstrndup(RSTRING_PTR(tmp), len);
635
+ state->indent_len = len;
636
+ }
637
+ tmp = rb_hash_aref(opts, ID2SYM(i_space));
638
+ if (RTEST(tmp)) {
639
+ int len;
640
+ Check_Type(tmp, T_STRING);
641
+ len = RSTRING_LEN(tmp);
642
+ state->space = fstrndup(RSTRING_PTR(tmp), len);
643
+ state->space_len = len;
644
+ }
645
+ tmp = rb_hash_aref(opts, ID2SYM(i_space_before));
646
+ if (RTEST(tmp)) {
647
+ int len;
648
+ Check_Type(tmp, T_STRING);
649
+ len = RSTRING_LEN(tmp);
650
+ state->space_before = fstrndup(RSTRING_PTR(tmp), len);
651
+ state->space_before_len = len;
652
+ }
653
+ tmp = rb_hash_aref(opts, ID2SYM(i_array_nl));
654
+ if (RTEST(tmp)) {
655
+ int len;
656
+ Check_Type(tmp, T_STRING);
657
+ len = RSTRING_LEN(tmp);
658
+ state->array_nl = fstrndup(RSTRING_PTR(tmp), len);
659
+ state->array_nl_len = len;
660
+ }
661
+ tmp = rb_hash_aref(opts, ID2SYM(i_object_nl));
662
+ if (RTEST(tmp)) {
663
+ int len;
664
+ Check_Type(tmp, T_STRING);
665
+ len = RSTRING_LEN(tmp);
666
+ state->object_nl = fstrndup(RSTRING_PTR(tmp), len);
667
+ state->object_nl_len = len;
668
+ }
669
+ tmp = ID2SYM(i_max_nesting);
670
+ state->max_nesting = 19;
671
+ if (option_given_p(opts, tmp)) {
672
+ VALUE max_nesting = rb_hash_aref(opts, tmp);
673
+ if (RTEST(max_nesting)) {
674
+ Check_Type(max_nesting, T_FIXNUM);
675
+ state->max_nesting = FIX2LONG(max_nesting);
676
+ } else {
677
+ state->max_nesting = 0;
678
+ }
679
+ }
680
+ tmp = ID2SYM(i_depth);
681
+ state->depth = 0;
682
+ if (option_given_p(opts, tmp)) {
683
+ VALUE depth = rb_hash_aref(opts, tmp);
684
+ if (RTEST(depth)) {
685
+ Check_Type(depth, T_FIXNUM);
686
+ state->depth = FIX2LONG(depth);
687
+ } else {
688
+ state->depth = 0;
689
+ }
690
+ }
691
+ tmp = rb_hash_aref(opts, ID2SYM(i_allow_nan));
692
+ state->allow_nan = RTEST(tmp);
693
+ tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only));
694
+ state->ascii_only = RTEST(tmp);
695
+ return self;
696
+ }
697
+
698
+ /*
699
+ * call-seq: to_h
700
+ *
701
+ * Returns the configuration instance variables as a hash, that can be
702
+ * passed to the configure method.
703
+ */
704
+ static VALUE cState_to_h(VALUE self)
705
+ {
706
+ VALUE result = rb_hash_new();
707
+ GET_STATE(self);
708
+ rb_hash_aset(result, ID2SYM(i_indent), rb_str_new(state->indent, state->indent_len));
709
+ rb_hash_aset(result, ID2SYM(i_space), rb_str_new(state->space, state->space_len));
710
+ rb_hash_aset(result, ID2SYM(i_space_before), rb_str_new(state->space_before, state->space_before_len));
711
+ rb_hash_aset(result, ID2SYM(i_object_nl), rb_str_new(state->object_nl, state->object_nl_len));
712
+ rb_hash_aset(result, ID2SYM(i_array_nl), rb_str_new(state->array_nl, state->array_nl_len));
713
+ rb_hash_aset(result, ID2SYM(i_allow_nan), state->allow_nan ? Qtrue : Qfalse);
714
+ rb_hash_aset(result, ID2SYM(i_ascii_only), state->ascii_only ? Qtrue : Qfalse);
715
+ rb_hash_aset(result, ID2SYM(i_max_nesting), LONG2FIX(state->max_nesting));
716
+ rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth));
717
+ return result;
718
+ }
719
+
720
+ /*
721
+ * call-seq: [](name)
722
+ *
723
+ * Return the value returned by method +name+.
724
+ */
725
+ static VALUE cState_aref(VALUE self, VALUE name)
726
+ {
727
+ GET_STATE(self);
728
+ if (RTEST(rb_funcall(self, i_respond_to_p, 1, name))) {
729
+ return rb_funcall(self, i_send, 1, name);
730
+ } else {
731
+ return Qnil;
732
+ }
733
+ }
734
+
735
+ static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
736
+ {
737
+ char *object_nl = state->object_nl;
738
+ long object_nl_len = state->object_nl_len;
739
+ char *indent = state->indent;
740
+ long indent_len = state->indent_len;
741
+ long max_nesting = state->max_nesting;
742
+ char *delim = FBUFFER_PTR(state->object_delim);
743
+ long delim_len = FBUFFER_LEN(state->object_delim);
744
+ char *delim2 = FBUFFER_PTR(state->object_delim2);
745
+ long delim2_len = FBUFFER_LEN(state->object_delim2);
746
+ long depth = ++state->depth;
747
+ int i, j;
748
+ VALUE key, key_to_s, keys;
749
+ if (max_nesting != 0 && depth > max_nesting) {
750
+ fbuffer_free(buffer);
751
+ rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
752
+ }
753
+ fbuffer_append_char(buffer, '{');
754
+ keys = rb_funcall(obj, i_keys, 0);
755
+ for(i = 0; i < RARRAY_LEN(keys); i++) {
756
+ if (i > 0) fbuffer_append(buffer, delim, delim_len);
757
+ if (object_nl) {
758
+ fbuffer_append(buffer, object_nl, object_nl_len);
759
+ }
760
+ if (indent) {
761
+ for (j = 0; j < depth; j++) {
762
+ fbuffer_append(buffer, indent, indent_len);
763
+ }
764
+ }
765
+ key = rb_ary_entry(keys, i);
766
+ key_to_s = rb_funcall(key, i_to_s, 0);
767
+ Check_Type(key_to_s, T_STRING);
768
+ generate_json(buffer, Vstate, state, key_to_s);
769
+ fbuffer_append(buffer, delim2, delim2_len);
770
+ generate_json(buffer, Vstate, state, rb_hash_aref(obj, key));
771
+ }
772
+ depth = --state->depth;
773
+ if (object_nl) {
774
+ fbuffer_append(buffer, object_nl, object_nl_len);
775
+ if (indent) {
776
+ for (j = 0; j < depth; j++) {
777
+ fbuffer_append(buffer, indent, indent_len);
778
+ }
779
+ }
780
+ }
781
+ fbuffer_append_char(buffer, '}');
782
+ }
783
+
784
+ static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
785
+ {
786
+ char *array_nl = state->array_nl;
787
+ long array_nl_len = state->array_nl_len;
788
+ char *indent = state->indent;
789
+ long indent_len = state->indent_len;
790
+ long max_nesting = state->max_nesting;
791
+ char *delim = FBUFFER_PTR(state->array_delim);
792
+ long delim_len = FBUFFER_LEN(state->array_delim);
793
+ long depth = ++state->depth;
794
+ int i, j;
795
+ if (max_nesting != 0 && depth > max_nesting) {
796
+ fbuffer_free(buffer);
797
+ rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
798
+ }
799
+ fbuffer_append_char(buffer, '[');
800
+ if (array_nl) fbuffer_append(buffer, array_nl, array_nl_len);
801
+ for(i = 0; i < RARRAY_LEN(obj); i++) {
802
+ if (i > 0) fbuffer_append(buffer, delim, delim_len);
803
+ if (indent) {
804
+ for (j = 0; j < depth; j++) {
805
+ fbuffer_append(buffer, indent, indent_len);
806
+ }
807
+ }
808
+ generate_json(buffer, Vstate, state, rb_ary_entry(obj, i));
809
+ }
810
+ state->depth = --depth;
811
+ if (array_nl) {
812
+ fbuffer_append(buffer, array_nl, array_nl_len);
813
+ if (indent) {
814
+ for (j = 0; j < depth; j++) {
815
+ fbuffer_append(buffer, indent, indent_len);
816
+ }
817
+ }
818
+ }
819
+ fbuffer_append_char(buffer, ']');
820
+ }
821
+
822
+ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
823
+ {
824
+ fbuffer_append_char(buffer, '"');
825
+ #ifdef HAVE_RUBY_ENCODING_H
826
+ obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8);
827
+ #endif
828
+ if (state->ascii_only) {
829
+ convert_UTF8_to_JSON_ASCII(buffer, obj);
830
+ } else {
831
+ convert_UTF8_to_JSON(buffer, obj);
832
+ }
833
+ fbuffer_append_char(buffer, '"');
834
+ }
835
+
836
+ static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
837
+ {
838
+ fbuffer_append(buffer, "null", 4);
839
+ }
840
+
841
+ static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
842
+ {
843
+ fbuffer_append(buffer, "false", 5);
844
+ }
845
+
846
+ static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
847
+ {
848
+ fbuffer_append(buffer, "true", 4);
849
+ }
850
+
851
+ static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
852
+ {
853
+ fbuffer_append_long(buffer, FIX2LONG(obj));
854
+ }
855
+
856
+ static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
857
+ {
858
+ VALUE tmp = rb_funcall(obj, i_to_s, 0);
859
+ fbuffer_append(buffer, RSTRING_PAIR(tmp));
860
+ }
861
+
862
+ static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
863
+ {
864
+ double value = RFLOAT_VALUE(obj);
865
+ char allow_nan = state->allow_nan;
866
+ VALUE tmp = rb_funcall(obj, i_to_s, 0);
867
+ if (!allow_nan) {
868
+ if (isinf(value)) {
869
+ fbuffer_free(buffer);
870
+ rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
871
+ } else if (isnan(value)) {
872
+ fbuffer_free(buffer);
873
+ rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
874
+ }
875
+ }
876
+ fbuffer_append(buffer, RSTRING_PAIR(tmp));
877
+ }
878
+
879
+ static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
880
+ {
881
+ VALUE tmp;
882
+ VALUE klass = CLASS_OF(obj);
883
+ if (klass == rb_cHash) {
884
+ generate_json_object(buffer, Vstate, state, obj);
885
+ } else if (klass == rb_cArray) {
886
+ generate_json_array(buffer, Vstate, state, obj);
887
+ } else if (klass == rb_cString) {
888
+ generate_json_string(buffer, Vstate, state, obj);
889
+ } else if (obj == Qnil) {
890
+ generate_json_null(buffer, Vstate, state, obj);
891
+ } else if (obj == Qfalse) {
892
+ generate_json_false(buffer, Vstate, state, obj);
893
+ } else if (obj == Qtrue) {
894
+ generate_json_true(buffer, Vstate, state, obj);
895
+ } else if (klass == rb_cFixnum) {
896
+ generate_json_fixnum(buffer, Vstate, state, obj);
897
+ } else if (klass == rb_cBignum) {
898
+ generate_json_bignum(buffer, Vstate, state, obj);
899
+ } else if (klass == rb_cFloat) {
900
+ generate_json_float(buffer, Vstate, state, obj);
901
+ } else if (rb_respond_to(obj, i_to_json)) {
902
+ tmp = rb_funcall(obj, i_to_json, 1, Vstate);
903
+ Check_Type(tmp, T_STRING);
904
+ fbuffer_append(buffer, RSTRING_PAIR(tmp));
905
+ } else {
906
+ tmp = rb_funcall(obj, i_to_s, 0);
907
+ Check_Type(tmp, T_STRING);
908
+ generate_json(buffer, Vstate, state, tmp);
909
+ }
910
+ }
911
+
912
+ static FBuffer *cState_prepare_buffer(VALUE self)
913
+ {
914
+ FBuffer *buffer = fbuffer_alloc();
915
+ GET_STATE(self);
916
+
917
+ if (state->object_delim) {
918
+ fbuffer_clear(state->object_delim);
919
+ } else {
920
+ state->object_delim = fbuffer_alloc_with_length(16);
921
+ }
922
+ fbuffer_append_char(state->object_delim, ',');
923
+ if (state->object_delim2) {
924
+ fbuffer_clear(state->object_delim2);
925
+ } else {
926
+ state->object_delim2 = fbuffer_alloc_with_length(16);
927
+ }
928
+ fbuffer_append_char(state->object_delim2, ':');
929
+ if (state->space) fbuffer_append(state->object_delim2, state->space, state->space_len);
930
+
931
+ if (state->array_delim) {
932
+ fbuffer_clear(state->array_delim);
933
+ } else {
934
+ state->array_delim = fbuffer_alloc_with_length(16);
935
+ }
936
+ fbuffer_append_char(state->array_delim, ',');
937
+ if (state->array_nl) fbuffer_append(state->array_delim, state->array_nl, state->array_nl_len);
938
+ return buffer;
939
+ }
940
+
941
+ static VALUE fbuffer_to_s(FBuffer *fb)
942
+ {
943
+ VALUE result = rb_str_new(FBUFFER_PAIR(fb));
944
+ fbuffer_free(fb);
945
+ FORCE_UTF8(result);
946
+ return result;
947
+ }
948
+
949
+ static VALUE cState_partial_generate(VALUE self, VALUE obj)
950
+ {
951
+ FBuffer *buffer = cState_prepare_buffer(self);
952
+ GET_STATE(self);
953
+ generate_json(buffer, self, state, obj);
954
+ return fbuffer_to_s(buffer);
955
+ }
956
+
957
+ /*
958
+ * call-seq: generate(obj)
959
+ *
960
+ * Generates a valid JSON document from object +obj+ and returns the
961
+ * result. If no valid JSON document can be created this method raises a
962
+ * GeneratorError exception.
963
+ */
964
+ static VALUE cState_generate(VALUE self, VALUE obj)
965
+ {
966
+ VALUE result = cState_partial_generate(self, obj);
967
+ VALUE re, args[2];
968
+ args[0] = rb_str_new2("\\A\\s*(?:\\[.*\\]|\\{.*\\})\\s*\\Z");
969
+ args[1] = CRegexp_MULTILINE;
970
+ re = rb_class_new_instance(2, args, rb_cRegexp);
971
+ if (NIL_P(rb_funcall(re, i_match, 1, result))) {
972
+ rb_raise(eGeneratorError, "only generation of JSON objects or arrays allowed");
973
+ }
974
+ return result;
975
+ }
976
+
977
+ /*
978
+ * call-seq: new(opts = {})
979
+ *
980
+ * Instantiates a new State object, configured by _opts_.
981
+ *
982
+ * _opts_ can have the following keys:
983
+ *
984
+ * * *indent*: a string used to indent levels (default: ''),
985
+ * * *space*: a string that is put after, a : or , delimiter (default: ''),
986
+ * * *space_before*: a string that is put before a : pair delimiter (default: ''),
987
+ * * *object_nl*: a string that is put at the end of a JSON object (default: ''),
988
+ * * *array_nl*: a string that is put at the end of a JSON array (default: ''),
989
+ * * *allow_nan*: true if NaN, Infinity, and -Infinity should be
990
+ * generated, otherwise an exception is thrown, if these values are
991
+ * encountered. This options defaults to false.
992
+ */
993
+ static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
994
+ {
995
+ VALUE opts;
996
+ GET_STATE(self);
997
+ state->max_nesting = 19;
998
+ rb_scan_args(argc, argv, "01", &opts);
999
+ if (!NIL_P(opts)) cState_configure(self, opts);
1000
+ return self;
1001
+ }
1002
+
1003
+ /*
1004
+ * call-seq: initialize_copy(orig)
1005
+ *
1006
+ * Initializes this object from orig if it to be duplicated/cloned and returns
1007
+ * it.
1008
+ */
1009
+ static VALUE cState_init_copy(VALUE obj, VALUE orig)
1010
+ {
1011
+ JSON_Generator_State *objState, *origState;
1012
+
1013
+ Data_Get_Struct(obj, JSON_Generator_State, objState);
1014
+ Data_Get_Struct(orig, JSON_Generator_State, origState);
1015
+ if (!objState) rb_raise(rb_eArgError, "unallocated JSON::State");
1016
+
1017
+ MEMCPY(objState, origState, JSON_Generator_State, 1);
1018
+ objState->indent = fstrndup(origState->indent, origState->indent_len);
1019
+ objState->space = fstrndup(origState->space, origState->space_len);
1020
+ objState->space_before = fstrndup(origState->space_before, origState->space_before_len);
1021
+ objState->object_nl = fstrndup(origState->object_nl, origState->object_nl_len);
1022
+ objState->array_nl = fstrndup(origState->array_nl, origState->array_nl_len);
1023
+ if (origState->array_delim) objState->array_delim = fbuffer_dup(origState->array_delim);
1024
+ if (origState->object_delim) objState->object_delim = fbuffer_dup(origState->object_delim);
1025
+ if (origState->object_delim2) objState->object_delim2 = fbuffer_dup(origState->object_delim2);
1026
+ return obj;
1027
+ }
1028
+
1029
+ /*
1030
+ * call-seq: from_state(opts)
1031
+ *
1032
+ * Creates a State object from _opts_, which ought to be Hash to create a
1033
+ * new State instance configured by _opts_, something else to create an
1034
+ * unconfigured instance. If _opts_ is a State object, it is just returned.
1035
+ */
1036
+ static VALUE cState_from_state_s(VALUE self, VALUE opts)
1037
+ {
1038
+ if (rb_obj_is_kind_of(opts, self)) {
1039
+ return opts;
1040
+ } else if (rb_obj_is_kind_of(opts, rb_cHash)) {
1041
+ return rb_funcall(self, i_new, 1, opts);
1042
+ } else {
1043
+ if (NIL_P(CJSON_SAFE_STATE_PROTOTYPE)) {
1044
+ CJSON_SAFE_STATE_PROTOTYPE = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
1045
+ }
1046
+ return rb_funcall(CJSON_SAFE_STATE_PROTOTYPE, i_dup, 0);
1047
+ }
1048
+ }
1049
+
1050
+ /*
1051
+ * call-seq: indent()
1052
+ *
1053
+ * This string is used to indent levels in the JSON text.
1054
+ */
1055
+ static VALUE cState_indent(VALUE self)
1056
+ {
1057
+ GET_STATE(self);
1058
+ return state->indent ? rb_str_new2(state->indent) : rb_str_new2("");
1059
+ }
1060
+
1061
+ /*
1062
+ * call-seq: indent=(indent)
1063
+ *
1064
+ * This string is used to indent levels in the JSON text.
1065
+ */
1066
+ static VALUE cState_indent_set(VALUE self, VALUE indent)
1067
+ {
1068
+ int len;
1069
+ GET_STATE(self);
1070
+ Check_Type(indent, T_STRING);
1071
+ len = RSTRING_LEN(indent);
1072
+ if (len == 0) {
1073
+ if (state->indent) {
1074
+ ruby_xfree(state->indent);
1075
+ state->indent = NULL;
1076
+ state->indent_len = 0;
1077
+ }
1078
+ } else {
1079
+ if (state->indent) ruby_xfree(state->indent);
1080
+ state->indent = strdup(RSTRING_PTR(indent));
1081
+ state->indent_len = len;
1082
+ }
1083
+ return Qnil;
1084
+ }
1085
+
1086
+ /*
1087
+ * call-seq: space()
1088
+ *
1089
+ * This string is used to insert a space between the tokens in a JSON
1090
+ * string.
1091
+ */
1092
+ static VALUE cState_space(VALUE self)
1093
+ {
1094
+ GET_STATE(self);
1095
+ return state->space ? rb_str_new2(state->space) : rb_str_new2("");
1096
+ }
1097
+
1098
+ /*
1099
+ * call-seq: space=(space)
1100
+ *
1101
+ * This string is used to insert a space between the tokens in a JSON
1102
+ * string.
1103
+ */
1104
+ static VALUE cState_space_set(VALUE self, VALUE space)
1105
+ {
1106
+ int len;
1107
+ GET_STATE(self);
1108
+ Check_Type(space, T_STRING);
1109
+ len = RSTRING_LEN(space);
1110
+ if (len == 0) {
1111
+ if (state->space) {
1112
+ ruby_xfree(state->space);
1113
+ state->space = NULL;
1114
+ state->space_len = 0;
1115
+ }
1116
+ } else {
1117
+ if (state->space) ruby_xfree(state->space);
1118
+ state->space = strdup(RSTRING_PTR(space));
1119
+ state->space_len = len;
1120
+ }
1121
+ return Qnil;
1122
+ }
1123
+
1124
+ /*
1125
+ * call-seq: space_before()
1126
+ *
1127
+ * This string is used to insert a space before the ':' in JSON objects.
1128
+ */
1129
+ static VALUE cState_space_before(VALUE self)
1130
+ {
1131
+ GET_STATE(self);
1132
+ return state->space_before ? rb_str_new2(state->space_before) : rb_str_new2("");
1133
+ }
1134
+
1135
+ /*
1136
+ * call-seq: space_before=(space_before)
1137
+ *
1138
+ * This string is used to insert a space before the ':' in JSON objects.
1139
+ */
1140
+ static VALUE cState_space_before_set(VALUE self, VALUE space_before)
1141
+ {
1142
+ int len;
1143
+ GET_STATE(self);
1144
+ Check_Type(space_before, T_STRING);
1145
+ len = RSTRING_LEN(space_before);
1146
+ if (len == 0) {
1147
+ if (state->space_before) {
1148
+ ruby_xfree(state->space_before);
1149
+ state->space_before = NULL;
1150
+ state->space_before_len = 0;
1151
+ }
1152
+ } else {
1153
+ if (state->space_before) ruby_xfree(state->space_before);
1154
+ state->space_before = strdup(RSTRING_PTR(space_before));
1155
+ state->space_before_len = len;
1156
+ }
1157
+ return Qnil;
1158
+ }
1159
+
1160
+ /*
1161
+ * call-seq: object_nl()
1162
+ *
1163
+ * This string is put at the end of a line that holds a JSON object (or
1164
+ * Hash).
1165
+ */
1166
+ static VALUE cState_object_nl(VALUE self)
1167
+ {
1168
+ GET_STATE(self);
1169
+ return state->object_nl ? rb_str_new2(state->object_nl) : rb_str_new2("");
1170
+ }
1171
+
1172
+ /*
1173
+ * call-seq: object_nl=(object_nl)
1174
+ *
1175
+ * This string is put at the end of a line that holds a JSON object (or
1176
+ * Hash).
1177
+ */
1178
+ static VALUE cState_object_nl_set(VALUE self, VALUE object_nl)
1179
+ {
1180
+ int len;
1181
+ GET_STATE(self);
1182
+ Check_Type(object_nl, T_STRING);
1183
+ len = RSTRING_LEN(object_nl);
1184
+ if (len == 0) {
1185
+ if (state->object_nl) {
1186
+ ruby_xfree(state->object_nl);
1187
+ state->object_nl = NULL;
1188
+ }
1189
+ } else {
1190
+ if (state->object_nl) ruby_xfree(state->object_nl);
1191
+ state->object_nl = strdup(RSTRING_PTR(object_nl));
1192
+ state->object_nl_len = len;
1193
+ }
1194
+ return Qnil;
1195
+ }
1196
+
1197
+ /*
1198
+ * call-seq: array_nl()
1199
+ *
1200
+ * This string is put at the end of a line that holds a JSON array.
1201
+ */
1202
+ static VALUE cState_array_nl(VALUE self)
1203
+ {
1204
+ GET_STATE(self);
1205
+ return state->array_nl ? rb_str_new2(state->array_nl) : rb_str_new2("");
1206
+ }
1207
+
1208
+ /*
1209
+ * call-seq: array_nl=(array_nl)
1210
+ *
1211
+ * This string is put at the end of a line that holds a JSON array.
1212
+ */
1213
+ static VALUE cState_array_nl_set(VALUE self, VALUE array_nl)
1214
+ {
1215
+ int len;
1216
+ GET_STATE(self);
1217
+ Check_Type(array_nl, T_STRING);
1218
+ len = RSTRING_LEN(array_nl);
1219
+ if (len == 0) {
1220
+ if (state->array_nl) {
1221
+ ruby_xfree(state->array_nl);
1222
+ state->array_nl = NULL;
1223
+ }
1224
+ } else {
1225
+ if (state->array_nl) ruby_xfree(state->array_nl);
1226
+ state->array_nl = strdup(RSTRING_PTR(array_nl));
1227
+ state->array_nl_len = len;
1228
+ }
1229
+ return Qnil;
1230
+ }
1231
+
1232
+
1233
+ /*
1234
+ * call-seq: check_circular?
1235
+ *
1236
+ * Returns true, if circular data structures should be checked,
1237
+ * otherwise returns false.
1238
+ */
1239
+ static VALUE cState_check_circular_p(VALUE self)
1240
+ {
1241
+ GET_STATE(self);
1242
+ return state->max_nesting ? Qtrue : Qfalse;
1243
+ }
1244
+
1245
+ /*
1246
+ * call-seq: max_nesting
1247
+ *
1248
+ * This integer returns the maximum level of data structure nesting in
1249
+ * the generated JSON, max_nesting = 0 if no maximum is checked.
1250
+ */
1251
+ static VALUE cState_max_nesting(VALUE self)
1252
+ {
1253
+ GET_STATE(self);
1254
+ return LONG2FIX(state->max_nesting);
1255
+ }
1256
+
1257
+ /*
1258
+ * call-seq: max_nesting=(depth)
1259
+ *
1260
+ * This sets the maximum level of data structure nesting in the generated JSON
1261
+ * to the integer depth, max_nesting = 0 if no maximum should be checked.
1262
+ */
1263
+ static VALUE cState_max_nesting_set(VALUE self, VALUE depth)
1264
+ {
1265
+ GET_STATE(self);
1266
+ Check_Type(depth, T_FIXNUM);
1267
+ return state->max_nesting = FIX2LONG(depth);
1268
+ }
1269
+
1270
+ /*
1271
+ * call-seq: allow_nan?
1272
+ *
1273
+ * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise
1274
+ * returns false.
1275
+ */
1276
+ static VALUE cState_allow_nan_p(VALUE self)
1277
+ {
1278
+ GET_STATE(self);
1279
+ return state->allow_nan ? Qtrue : Qfalse;
1280
+ }
1281
+
1282
+ /*
1283
+ * call-seq: ascii_only?
1284
+ *
1285
+ * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise
1286
+ * returns false.
1287
+ */
1288
+ static VALUE cState_ascii_only_p(VALUE self)
1289
+ {
1290
+ GET_STATE(self);
1291
+ return state->ascii_only ? Qtrue : Qfalse;
1292
+ }
1293
+
1294
+ /*
1295
+ * call-seq: depth
1296
+ *
1297
+ * This integer returns the current depth of data structure nesting.
1298
+ */
1299
+ static VALUE cState_depth(VALUE self)
1300
+ {
1301
+ GET_STATE(self);
1302
+ return LONG2FIX(state->depth);
1303
+ }
1304
+
1305
+ /*
1306
+ * call-seq: depth=(depth)
1307
+ *
1308
+ * This sets the maximum level of data structure nesting in the generated JSON
1309
+ * to the integer depth, max_nesting = 0 if no maximum should be checked.
1310
+ */
1311
+ static VALUE cState_depth_set(VALUE self, VALUE depth)
1312
+ {
1313
+ GET_STATE(self);
1314
+ Check_Type(depth, T_FIXNUM);
1315
+ return state->depth = FIX2LONG(depth);
1316
+ }
1317
+
1318
+ /*
1319
+ *
1320
+ */
1321
+ void Init_generator()
1322
+ {
1323
+ rb_require("json/common");
1324
+
1325
+ mJSON = rb_define_module("JSON");
1326
+ mExt = rb_define_module_under(mJSON, "Ext");
1327
+ mGenerator = rb_define_module_under(mExt, "Generator");
1328
+
1329
+ eGeneratorError = rb_path2class("JSON::GeneratorError");
1330
+ eNestingError = rb_path2class("JSON::NestingError");
1331
+
1332
+ cState = rb_define_class_under(mGenerator, "State", rb_cObject);
1333
+ rb_define_alloc_func(cState, cState_s_allocate);
1334
+ rb_define_singleton_method(cState, "from_state", cState_from_state_s, 1);
1335
+ rb_define_method(cState, "initialize", cState_initialize, -1);
1336
+ rb_define_method(cState, "initialize_copy", cState_init_copy, 1);
1337
+ rb_define_method(cState, "indent", cState_indent, 0);
1338
+ rb_define_method(cState, "indent=", cState_indent_set, 1);
1339
+ rb_define_method(cState, "space", cState_space, 0);
1340
+ rb_define_method(cState, "space=", cState_space_set, 1);
1341
+ rb_define_method(cState, "space_before", cState_space_before, 0);
1342
+ rb_define_method(cState, "space_before=", cState_space_before_set, 1);
1343
+ rb_define_method(cState, "object_nl", cState_object_nl, 0);
1344
+ rb_define_method(cState, "object_nl=", cState_object_nl_set, 1);
1345
+ rb_define_method(cState, "array_nl", cState_array_nl, 0);
1346
+ rb_define_method(cState, "array_nl=", cState_array_nl_set, 1);
1347
+ rb_define_method(cState, "max_nesting", cState_max_nesting, 0);
1348
+ rb_define_method(cState, "max_nesting=", cState_max_nesting_set, 1);
1349
+ rb_define_method(cState, "check_circular?", cState_check_circular_p, 0);
1350
+ rb_define_method(cState, "allow_nan?", cState_allow_nan_p, 0);
1351
+ rb_define_method(cState, "ascii_only?", cState_ascii_only_p, 0);
1352
+ rb_define_method(cState, "depth", cState_depth, 0);
1353
+ rb_define_method(cState, "depth=", cState_depth_set, 1);
1354
+ rb_define_method(cState, "configure", cState_configure, 1);
1355
+ rb_define_method(cState, "to_h", cState_to_h, 0);
1356
+ rb_define_method(cState, "[]", cState_aref, 1);
1357
+ rb_define_method(cState, "generate", cState_generate, 1);
1358
+
1359
+ mGeneratorMethods = rb_define_module_under(mGenerator, "GeneratorMethods");
1360
+ mObject = rb_define_module_under(mGeneratorMethods, "Object");
1361
+ rb_define_method(mObject, "to_json", mObject_to_json, -1);
1362
+ mHash = rb_define_module_under(mGeneratorMethods, "Hash");
1363
+ rb_define_method(mHash, "to_json", mHash_to_json, -1);
1364
+ mArray = rb_define_module_under(mGeneratorMethods, "Array");
1365
+ rb_define_method(mArray, "to_json", mArray_to_json, -1);
1366
+ mFixnum = rb_define_module_under(mGeneratorMethods, "Fixnum");
1367
+ rb_define_method(mFixnum, "to_json", mFixnum_to_json, -1);
1368
+ mBignum = rb_define_module_under(mGeneratorMethods, "Bignum");
1369
+ rb_define_method(mBignum, "to_json", mBignum_to_json, -1);
1370
+ mFloat = rb_define_module_under(mGeneratorMethods, "Float");
1371
+ rb_define_method(mFloat, "to_json", mFloat_to_json, -1);
1372
+ mString = rb_define_module_under(mGeneratorMethods, "String");
1373
+ rb_define_singleton_method(mString, "included", mString_included_s, 1);
1374
+ rb_define_method(mString, "to_json", mString_to_json, -1);
1375
+ rb_define_method(mString, "to_json_raw", mString_to_json_raw, -1);
1376
+ rb_define_method(mString, "to_json_raw_object", mString_to_json_raw_object, 0);
1377
+ mString_Extend = rb_define_module_under(mString, "Extend");
1378
+ rb_define_method(mString_Extend, "json_create", mString_Extend_json_create, 1);
1379
+ mTrueClass = rb_define_module_under(mGeneratorMethods, "TrueClass");
1380
+ rb_define_method(mTrueClass, "to_json", mTrueClass_to_json, -1);
1381
+ mFalseClass = rb_define_module_under(mGeneratorMethods, "FalseClass");
1382
+ rb_define_method(mFalseClass, "to_json", mFalseClass_to_json, -1);
1383
+ mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass");
1384
+ rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1);
1385
+
1386
+ CRegexp_MULTILINE = rb_const_get(rb_cRegexp, rb_intern("MULTILINE"));
1387
+ i_to_s = rb_intern("to_s");
1388
+ i_to_json = rb_intern("to_json");
1389
+ i_new = rb_intern("new");
1390
+ i_indent = rb_intern("indent");
1391
+ i_space = rb_intern("space");
1392
+ i_space_before = rb_intern("space_before");
1393
+ i_object_nl = rb_intern("object_nl");
1394
+ i_array_nl = rb_intern("array_nl");
1395
+ i_max_nesting = rb_intern("max_nesting");
1396
+ i_allow_nan = rb_intern("allow_nan");
1397
+ i_ascii_only = rb_intern("ascii_only");
1398
+ i_depth = rb_intern("depth");
1399
+ i_pack = rb_intern("pack");
1400
+ i_unpack = rb_intern("unpack");
1401
+ i_create_id = rb_intern("create_id");
1402
+ i_extend = rb_intern("extend");
1403
+ i_key_p = rb_intern("key?");
1404
+ i_aref = rb_intern("[]");
1405
+ i_send = rb_intern("__send__");
1406
+ i_respond_to_p = rb_intern("respond_to?");
1407
+ i_match = rb_intern("match");
1408
+ i_keys = rb_intern("keys");
1409
+ i_dup = rb_intern("dup");
1410
+ #ifdef HAVE_RUBY_ENCODING_H
1411
+ CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
1412
+ i_encoding = rb_intern("encoding");
1413
+ i_encode = rb_intern("encode");
1414
+ #endif
1415
+ i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE");
1416
+ CJSON_SAFE_STATE_PROTOTYPE = Qnil;
1417
+ }