oj 2.18.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -226
  3. data/ext/oj/circarray.c +0 -25
  4. data/ext/oj/circarray.h +0 -25
  5. data/ext/oj/code.c +227 -0
  6. data/ext/oj/code.h +40 -0
  7. data/ext/oj/compat.c +126 -38
  8. data/ext/oj/custom.c +1097 -0
  9. data/ext/oj/dump.c +658 -2376
  10. data/ext/oj/dump.h +92 -0
  11. data/ext/oj/dump_compat.c +937 -0
  12. data/ext/oj/dump_leaf.c +254 -0
  13. data/ext/oj/dump_object.c +810 -0
  14. data/ext/oj/dump_rails.c +329 -0
  15. data/ext/oj/dump_strict.c +416 -0
  16. data/ext/oj/err.c +0 -25
  17. data/ext/oj/err.h +8 -2
  18. data/ext/oj/fast.c +24 -24
  19. data/ext/oj/mimic_json.c +817 -0
  20. data/ext/oj/mimic_rails.c +806 -0
  21. data/ext/oj/mimic_rails.h +17 -0
  22. data/ext/oj/object.c +18 -72
  23. data/ext/oj/odd.c +0 -25
  24. data/ext/oj/odd.h +2 -27
  25. data/ext/oj/oj.c +655 -1503
  26. data/ext/oj/oj.h +93 -40
  27. data/ext/oj/parse.c +99 -46
  28. data/ext/oj/parse.h +12 -26
  29. data/ext/oj/reader.c +1 -25
  30. data/ext/oj/reader.h +3 -25
  31. data/ext/oj/resolve.c +9 -11
  32. data/ext/oj/resolve.h +2 -2
  33. data/ext/oj/rxclass.c +133 -0
  34. data/ext/oj/rxclass.h +27 -0
  35. data/ext/oj/saj.c +4 -25
  36. data/ext/oj/scp.c +3 -25
  37. data/ext/oj/sparse.c +89 -13
  38. data/ext/oj/stream_writer.c +301 -0
  39. data/ext/oj/strict.c +4 -27
  40. data/ext/oj/string_writer.c +480 -0
  41. data/ext/oj/val_stack.h +6 -2
  42. data/lib/oj.rb +1 -23
  43. data/lib/oj/easy_hash.rb +12 -4
  44. data/lib/oj/json.rb +172 -0
  45. data/lib/oj/mimic.rb +123 -18
  46. data/lib/oj/state.rb +131 -0
  47. data/lib/oj/version.rb +1 -1
  48. data/pages/Advanced.md +22 -0
  49. data/pages/Compatibility.md +25 -0
  50. data/pages/Custom.md +23 -0
  51. data/pages/Encoding.md +65 -0
  52. data/pages/JsonGem.md +79 -0
  53. data/pages/Modes.md +140 -0
  54. data/pages/Options.md +250 -0
  55. data/pages/Rails.md +60 -0
  56. data/pages/Security.md +20 -0
  57. data/test/activesupport4/decoding_test.rb +105 -0
  58. data/test/activesupport4/encoding_test.rb +531 -0
  59. data/test/activesupport4/test_helper.rb +41 -0
  60. data/test/activesupport5/decoding_test.rb +125 -0
  61. data/test/activesupport5/encoding_test.rb +483 -0
  62. data/test/activesupport5/encoding_test_cases.rb +90 -0
  63. data/test/activesupport5/test_helper.rb +50 -0
  64. data/test/activesupport5/time_zone_test_helpers.rb +24 -0
  65. data/test/json_gem/json_addition_test.rb +216 -0
  66. data/test/json_gem/json_common_interface_test.rb +143 -0
  67. data/test/json_gem/json_encoding_test.rb +109 -0
  68. data/test/json_gem/json_ext_parser_test.rb +20 -0
  69. data/test/json_gem/json_fixtures_test.rb +35 -0
  70. data/test/json_gem/json_generator_test.rb +383 -0
  71. data/test/json_gem/json_generic_object_test.rb +90 -0
  72. data/test/json_gem/json_parser_test.rb +470 -0
  73. data/test/json_gem/json_string_matching_test.rb +42 -0
  74. data/test/json_gem/test_helper.rb +18 -0
  75. data/test/perf_compat.rb +30 -28
  76. data/test/perf_object.rb +1 -1
  77. data/test/perf_strict.rb +18 -1
  78. data/test/sample.rb +0 -1
  79. data/test/test_compat.rb +169 -93
  80. data/test/test_custom.rb +355 -0
  81. data/test/test_file.rb +0 -8
  82. data/test/test_null.rb +376 -0
  83. data/test/test_object.rb +268 -3
  84. data/test/test_scp.rb +22 -1
  85. data/test/test_strict.rb +160 -4
  86. data/test/test_various.rb +52 -620
  87. data/test/tests.rb +14 -0
  88. data/test/tests_mimic.rb +14 -0
  89. data/test/tests_mimic_addition.rb +7 -0
  90. metadata +89 -47
  91. data/test/activesupport_datetime_test.rb +0 -23
  92. data/test/bug.rb +0 -51
  93. data/test/bug2.rb +0 -10
  94. data/test/bug3.rb +0 -46
  95. data/test/bug_fast.rb +0 -32
  96. data/test/bug_load.rb +0 -24
  97. data/test/crash.rb +0 -111
  98. data/test/curl/curl_oj.rb +0 -46
  99. data/test/curl/get_oj.rb +0 -24
  100. data/test/curl/just_curl.rb +0 -31
  101. data/test/curl/just_oj.rb +0 -51
  102. data/test/example.rb +0 -11
  103. data/test/foo.rb +0 -24
  104. data/test/io.rb +0 -48
  105. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  106. data/test/mod.rb +0 -16
  107. data/test/rails.rb +0 -50
  108. data/test/russian.rb +0 -18
  109. data/test/struct.rb +0 -29
  110. data/test/test_serializer.rb +0 -59
  111. data/test/write_timebars.rb +0 -31
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- %w(lib ext test).each do |dir|
5
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
6
- end
7
-
8
- require 'oj'
9
-
10
- def create_item(doc)
11
- #puts "#{doc.fetch('/id')}: #{doc.fetch('/labels/it/value')} - #{doc.fetch('/descriptions/it/value')}"
12
- doc.fetch('/id')
13
- doc.fetch('/labels/it/value')
14
- doc.fetch('/descriptions/it/value')
15
- end
16
-
17
- 100.times { |i|
18
- File.open('dump_10k.json') { |f|
19
- f.each { |line|
20
- #Oj::Doc.open(line) { |doc|
21
- doc = Oj::Doc.open(line)
22
- begin
23
- create_item(doc) if doc.fetch('/type') == 'item'
24
- rescue Exception => e
25
- puts "*** #{e.class}: #{e.message}"
26
- end
27
- doc.close
28
- #}
29
- }
30
- }
31
- puts i
32
- }
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- %w(lib ext test).each do |dir|
5
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
6
- end
7
-
8
- require 'oj'
9
-
10
- def create_item(doc)
11
- item_id = doc['source']
12
- # ...
13
- puts item_id
14
- end
15
-
16
- File.open('log.json') { |f|
17
- Oj::load(f, mode: :compat) { |doc|
18
- begin
19
- create_item(doc) if doc['msgType'] == 1
20
- rescue Exception => e
21
- puts "*** #{e.class}: #{e.message}"
22
- end
23
- }
24
- }
@@ -1,111 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $VERBOSE = true
5
-
6
- %w(lib ext test).each do |dir|
7
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
8
- end
9
-
10
- require 'sqlite3'
11
- require 'active_record'
12
- require 'oj'
13
- require 'representable'
14
- require 'representable/json'
15
- require 'multi_json'
16
- MultiJson.use(:oj)
17
- Oj.default_options = {mode: :object, indent: 2}
18
-
19
- #ActiveRecord::Base.logger = Logger.new(STDERR)
20
-
21
- ActiveRecord::Base.establish_connection(
22
- :adapter => "sqlite3",
23
- :database => ":memory:"
24
- )
25
-
26
- ActiveRecord::Schema.define do
27
- create_table :users do |t|
28
- t.string "first_name"
29
- t.string "last_name"
30
- t.string "picture"
31
- t.integer "state", null: false
32
- t.integer "visible", default: 1, null: false
33
- t.integer "role", null: false
34
- t.string "position"
35
- t.integer "responded", default: 0
36
- t.string "slug"
37
- end
38
- end
39
-
40
- class User < ActiveRecord::Base
41
- end
42
- User.find_or_create_by(first_name: "John", last_name: "Smith",role:1,id:1,state: 0)
43
- User.find_or_create_by(first_name: "John", last_name: "Smith",role:1,id:2,state: 0)
44
-
45
-
46
- class PersonDecorator < Representable::Decorator
47
- include Representable::JSON
48
- include Representable::Hash
49
-
50
- property :id
51
-
52
- property :first_name
53
-
54
- property :last_name,
55
- default: nil
56
-
57
- property :name,
58
- getter: ->(_){ "#{first_name} #{last_name}".strip },
59
- writeable: false
60
-
61
- property :visible,
62
- render_filter: lambda{ |value, _| !value.zero? },
63
- parse_filter: lambda{ |value, _| value ? 1 : 0 },
64
- default: 1
65
-
66
- property :role,
67
- render_filter: lambda{ |value, _| { 1 => 'staff', 2 => 'manager' }[value].to_s },
68
- writeable: false
69
-
70
- property :position
71
-
72
- nested :image, skip_render: lambda{ |options| options[:represented].picture.nil? } do
73
- property :picture, as: :url, writeable: false
74
- end
75
-
76
- end
77
-
78
- class PersonViewModel
79
-
80
- def initialize(person, organization)
81
- @users = User.all
82
- @person = person
83
- @organization = organization
84
- end
85
-
86
- def to_json(options={})
87
- PersonDecorator.represent(@users.to_a)
88
- end
89
-
90
- def json_with_decorator(options={})
91
- PersonDecorator.new(person).to_json
92
- end
93
-
94
- def person
95
- @person
96
- end
97
- end
98
-
99
- class EmployeeViewModel < PersonViewModel
100
-
101
- end
102
-
103
- employee = User.find(1)
104
- emp_json = EmployeeViewModel.new(employee,nil)
105
- puts emp_json.to_json.to_json
106
- puts emp_json.json_with_decorator
107
- Oj.mimic_JSON
108
- # when i use Oj.mimic_JSON script crash
109
- # when i dont use Oj.mimic_JSON then dont use correct decorator
110
- puts Oj.dump(emp_json)
111
- puts Oj.dump(emp_json.to_json)
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- #$VERBOSE = true
5
-
6
- $: << File.dirname(__FILE__)
7
- $: << File.expand_path("../../ext")
8
- $: << File.expand_path("../../lib")
9
- $: << File.expand_path("../../../curb/ext")
10
- $: << File.expand_path("../../../curb/lib")
11
-
12
- require 'curb'
13
- require 'oj'
14
-
15
- $cnt = 0
16
-
17
- $url = "localhost:7660/data.json"
18
-
19
- begin
20
- while true
21
- before = GC.count
22
- curl = Curl::Easy.new($url)
23
- curl.ssl_verify_host = false
24
- curl.http_get
25
- if before != GC.count
26
- puts " did a GC in curl #{GC.count}"
27
- before = GC.count
28
- end
29
- =begin
30
- data = Oj.load(curl.body, symbol_keys: true, mode: :strict)
31
- puts " did a GC in Oj #{GC.count}" if before != GC.count
32
-
33
- if data[:data].nil? or data[:data].any? { |e| e.empty? }
34
- puts "body: #{curl.body}"
35
- raise "FAILED"
36
- end
37
- =end
38
- $cnt += 1
39
- print "\r #{$cnt}"
40
- end
41
- rescue Exception => e
42
- puts "#{e.class}: #{e.message}"
43
- puts "url: #{$url}"
44
- #puts "data: #{data}"
45
- #puts "data[data]: #{data[:data]}"
46
- end
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $VERBOSE = true
5
-
6
- $: << File.dirname(__FILE__)
7
- $: << File.expand_path("../../ext")
8
- $: << File.expand_path("../../lib")
9
-
10
- require 'net/http'
11
- require 'uri'
12
- require 'oj'
13
-
14
- $url = URI.parse("http://localhost:7660/data.json")
15
-
16
- $cnt = 0
17
-
18
- while true
19
- response = Net::HTTP.get_response($url)
20
- data = Oj.load(response.body, symbol_keys: true, mode: :strict)
21
- raise "FAILED" if data[:data].any? { |e| e.empty? }
22
- $cnt += 1
23
- print "\r #{$cnt}"
24
- end
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- #$VERBOSE = true
5
-
6
- $: << File.dirname(__FILE__)
7
- #$: << File.expand_path("../../../curb/ext")
8
- #$: << File.expand_path("../../../curb/lib")
9
-
10
- require 'curb'
11
-
12
- $cnt = 0
13
- $url = "localhost:7660/data.json"
14
-
15
- begin
16
- while true
17
- before = GC.count
18
- curl = Curl::Easy.new($url)
19
- curl.ssl_verify_host = false
20
- curl.http_get
21
- if before != GC.count
22
- puts " did a GC in curl #{GC.count}"
23
- before = GC.count
24
- end
25
- $cnt += 1
26
- print "\r #{$cnt}"
27
- end
28
- rescue Exception => e
29
- puts "#{e.class}: #{e.message}"
30
- puts "url: #{$url}"
31
- end
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $VERBOSE = true
5
-
6
- $: << File.dirname(__FILE__)
7
- $: << File.expand_path("../../ext")
8
- $: << File.expand_path("../../lib")
9
-
10
- require 'oj'
11
-
12
- $json = %|
13
- {
14
- "data" : [ {
15
- "action" : "login",
16
- "event" : "user",
17
- "field" : "login",
18
- "value" : "foobar",
19
- "info" : "Authenticated \\"Foo Bar\\"",
20
- "id" : "585929918297f2740ed9f5f0",
21
- "_metadata" : {
22
- "version" : "1"
23
- },
24
- "timestamp" : "2016-12-20T07:52:33",
25
- "key_id" : "4"
26
- } ],
27
- "info" : {
28
- "view" : "partial",
29
- "limit" : 500,
30
- "offset" : 2000,
31
- "results" : 500,
32
- "ordering" : "timestamp desc,id",
33
- "previous" : "https://api.server.com/some/path/event?calculate_total=false&draft=base&order_by=timestamp_desc&order_by=id&subdraft=none&offset=1500&limit=500",
34
- "next" : "https://api.server.com/some/path/event?calculate_total=false&draft=base&order_by=timestamp_desc&order_by=id&subdraft=none&offset=2500&limit=500",
35
- "draft" : "base",
36
- "subdraft" : "none",
37
- "total_results" : 100000
38
- }
39
- }
40
- |
41
-
42
- $cnt = 0
43
-
44
- while true
45
- before = GC.count
46
- data = Oj.load($json, symbol_keys: true, mode: :strict)
47
- puts " did a GC in Oj #{GC.count} - #{$cnt}" if before != GC.count
48
- raise "FAILED" if data[:data].any? { |e| e.empty? }
49
- $cnt += 1
50
- print "\r #{$cnt}" if 0 == ($cnt % 10000)
51
- end
@@ -1,11 +0,0 @@
1
- %w(lib ext test).each do |dir|
2
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
3
- end
4
- require 'oj'
5
- require 'json'
6
-
7
- Oj::Doc.open([{:name => "T-Shirt"}].to_json) do |doc|
8
- doc.each_child do |child|
9
- p child.fetch("name")
10
- end
11
- end
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $VERBOSE = true
5
-
6
- here = File.expand_path(File.dirname(__FILE__))
7
- $: << File.dirname(__FILE__)
8
- $: << File.join(File.dirname(here), 'ext')
9
- $: << File.join(File.dirname(here), 'lib')
10
-
11
- require 'oj'
12
-
13
- Oj.mimic_JSON()
14
-
15
- class Foo
16
- def as_json
17
- { foo: 'bar' }
18
- end
19
- end
20
-
21
- opts = {}
22
-
23
- puts Foo.new.to_json
24
- puts Foo.new.to_json(opts)
data/test/io.rb DELETED
@@ -1,48 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.dirname(__FILE__)
5
-
6
- require 'helper'
7
-
8
- class Handler
9
- def initialize
10
- @state = []
11
- end
12
-
13
- def hash_start
14
- @state << {}
15
- @state.last
16
- end
17
-
18
- def hash_end
19
- @state.pop
20
- end
21
-
22
- def hash_set(h,k,v)
23
- h.store(k,v)
24
- end
25
-
26
- def array_start
27
- @state << []
28
- @state.last
29
- end
30
-
31
-
32
- def array_end
33
- @state.pop
34
- end
35
-
36
- def array_append(a,v)
37
- a << v
38
- end
39
-
40
- def error(message, line, column); p "ERROR: #{message}" end
41
- end
42
-
43
- handler = Handler.new
44
- def handler.add_value(v)
45
- p v
46
- end
47
-
48
- Oj.sc_parse(handler, StringIO.new('{"a":"b","c":[1,2,{"d":"e"}]}[4,5,6]'))
@@ -1,27 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.join(File.dirname(__FILE__), '..')
5
-
6
- require 'helper'
7
- require 'oj/active_support_helper'
8
-
9
- class ObjectFolder < Minitest::Test
10
- def setup
11
- @default_options = Oj.default_options
12
- end
13
-
14
- def teardown
15
- Oj.default_options = @default_options
16
- end
17
-
18
- def test_as_json
19
- Oj.mimic_JSON()
20
- dt = DateTime.now()
21
-
22
- json = dt.to_json()
23
-
24
- puts json
25
- end
26
-
27
- end
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- %w(lib ext test).each do |dir|
5
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
6
- end
7
-
8
- require 'oj'
9
-
10
-
11
- Thread.new do
12
- string_io = StringIO.new('{"foo":"bar"}')
13
- Oj.load(string_io)
14
- string_io.rewind
15
- puts string_io.read
16
- end.join