json 1.0.0 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/CHANGES.md +503 -0
 - data/LICENSE +56 -0
 - data/README.md +416 -0
 - data/ext/json/ext/fbuffer/fbuffer.h +187 -0
 - data/ext/json/ext/generator/depend +1 -0
 - data/ext/json/ext/generator/extconf.rb +2 -7
 - data/ext/json/ext/generator/generator.c +1312 -338
 - data/ext/json/ext/generator/generator.h +177 -0
 - data/ext/json/ext/parser/depend +1 -0
 - data/ext/json/ext/parser/extconf.rb +28 -5
 - data/ext/json/ext/parser/parser.c +1349 -689
 - data/ext/json/ext/parser/parser.h +96 -0
 - data/ext/json/ext/parser/parser.rl +644 -188
 - data/ext/json/extconf.rb +3 -0
 - data/json.gemspec +68 -0
 - data/lib/json/add/bigdecimal.rb +58 -0
 - data/lib/json/add/complex.rb +51 -0
 - data/lib/json/add/core.rb +12 -0
 - data/lib/json/add/date.rb +54 -0
 - data/lib/json/add/date_time.rb +67 -0
 - data/lib/json/add/exception.rb +49 -0
 - data/lib/json/add/ostruct.rb +54 -0
 - data/lib/json/add/range.rb +54 -0
 - data/lib/json/add/rational.rb +49 -0
 - data/lib/json/add/regexp.rb +48 -0
 - data/lib/json/add/set.rb +48 -0
 - data/lib/json/add/struct.rb +52 -0
 - data/lib/json/add/symbol.rb +48 -0
 - data/lib/json/add/time.rb +59 -0
 - data/lib/json/common.rb +588 -74
 - data/lib/json/ext.rb +3 -1
 - data/lib/json/generic_object.rb +75 -0
 - data/lib/json/pure/generator.rb +311 -119
 - data/lib/json/pure/parser.rb +182 -55
 - data/lib/json/pure.rb +5 -65
 - data/lib/json/version.rb +2 -1
 - data/lib/json.rb +583 -196
 - metadata +78 -137
 - data/CHANGES +0 -25
 - data/GPL +0 -340
 - data/README +0 -77
 - data/Rakefile +0 -250
 - data/TODO +0 -1
 - data/VERSION +0 -1
 - data/benchmarks/benchmark.txt +0 -133
 - data/benchmarks/benchmark_generator.rb +0 -44
 - data/benchmarks/benchmark_parser.rb +0 -22
 - data/benchmarks/benchmark_rails.rb +0 -26
 - data/bin/edit_json.rb +0 -11
 - data/data/example.json +0 -1
 - data/data/index.html +0 -37
 - data/data/prototype.js +0 -2515
 - data/ext/json/ext/generator/Makefile +0 -149
 - data/ext/json/ext/generator/unicode.c +0 -184
 - data/ext/json/ext/generator/unicode.h +0 -40
 - data/ext/json/ext/parser/Makefile +0 -149
 - data/ext/json/ext/parser/unicode.c +0 -156
 - data/ext/json/ext/parser/unicode.h +0 -44
 - data/install.rb +0 -26
 - data/lib/json/Array.xpm +0 -21
 - data/lib/json/FalseClass.xpm +0 -21
 - data/lib/json/Hash.xpm +0 -21
 - data/lib/json/Key.xpm +0 -73
 - data/lib/json/NilClass.xpm +0 -21
 - data/lib/json/Numeric.xpm +0 -28
 - data/lib/json/String.xpm +0 -96
 - data/lib/json/TrueClass.xpm +0 -21
 - data/lib/json/editor.rb +0 -1207
 - data/lib/json/json.xpm +0 -1499
 - data/tests/fixtures/fail1.json +0 -1
 - data/tests/fixtures/fail10.json +0 -1
 - data/tests/fixtures/fail11.json +0 -1
 - data/tests/fixtures/fail12.json +0 -1
 - data/tests/fixtures/fail13.json +0 -1
 - data/tests/fixtures/fail14.json +0 -1
 - data/tests/fixtures/fail15.json +0 -1
 - data/tests/fixtures/fail16.json +0 -1
 - data/tests/fixtures/fail17.json +0 -1
 - data/tests/fixtures/fail19.json +0 -1
 - data/tests/fixtures/fail2.json +0 -1
 - data/tests/fixtures/fail20.json +0 -1
 - data/tests/fixtures/fail21.json +0 -1
 - data/tests/fixtures/fail22.json +0 -1
 - data/tests/fixtures/fail23.json +0 -1
 - data/tests/fixtures/fail24.json +0 -1
 - data/tests/fixtures/fail25.json +0 -1
 - data/tests/fixtures/fail26.json +0 -1
 - data/tests/fixtures/fail27.json +0 -2
 - data/tests/fixtures/fail28.json +0 -2
 - data/tests/fixtures/fail3.json +0 -1
 - data/tests/fixtures/fail4.json +0 -1
 - data/tests/fixtures/fail5.json +0 -1
 - data/tests/fixtures/fail6.json +0 -1
 - data/tests/fixtures/fail7.json +0 -1
 - data/tests/fixtures/fail8.json +0 -1
 - data/tests/fixtures/fail9.json +0 -1
 - data/tests/fixtures/pass1.json +0 -56
 - data/tests/fixtures/pass18.json +0 -1
 - data/tests/fixtures/pass2.json +0 -1
 - data/tests/fixtures/pass3.json +0 -6
 - data/tests/runner.rb +0 -24
 - data/tests/test_json.rb +0 -235
 - data/tests/test_json_addition.rb +0 -94
 - data/tests/test_json_fixtures.rb +0 -30
 - data/tests/test_json_generate.rb +0 -81
 - data/tests/test_json_unicode.rb +0 -55
 - data/tools/fuzz.rb +0 -133
 - data/tools/server.rb +0 -62
 
    
        data/ext/json/extconf.rb
    ADDED
    
    
    
        data/json.gemspec
    ADDED
    
    | 
         @@ -0,0 +1,68 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            version = File.foreach(File.join(__dir__, "lib/json/version.rb")) do |line|
         
     | 
| 
      
 2 
     | 
    
         
            +
              /^\s*VERSION\s*=\s*'(.*)'/ =~ line and break $1
         
     | 
| 
      
 3 
     | 
    
         
            +
            end rescue nil
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Gem::Specification.new do |s|
         
     | 
| 
      
 6 
     | 
    
         
            +
              s.name = "json"
         
     | 
| 
      
 7 
     | 
    
         
            +
              s.version = version
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              s.summary = "JSON Implementation for Ruby"
         
     | 
| 
      
 10 
     | 
    
         
            +
              s.description = "This is a JSON implementation as a Ruby extension in C."
         
     | 
| 
      
 11 
     | 
    
         
            +
              s.licenses = ["Ruby"]
         
     | 
| 
      
 12 
     | 
    
         
            +
              s.authors = ["Florian Frank"]
         
     | 
| 
      
 13 
     | 
    
         
            +
              s.email = "flori@ping.de"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              s.extensions = ["ext/json/ext/generator/extconf.rb", "ext/json/ext/parser/extconf.rb", "ext/json/extconf.rb"]
         
     | 
| 
      
 16 
     | 
    
         
            +
              s.extra_rdoc_files = ["README.md"]
         
     | 
| 
      
 17 
     | 
    
         
            +
              s.rdoc_options = ["--title", "JSON implementation for Ruby", "--main", "README.md"]
         
     | 
| 
      
 18 
     | 
    
         
            +
              s.files = [
         
     | 
| 
      
 19 
     | 
    
         
            +
                "CHANGES.md",
         
     | 
| 
      
 20 
     | 
    
         
            +
                "LICENSE",
         
     | 
| 
      
 21 
     | 
    
         
            +
                "README.md",
         
     | 
| 
      
 22 
     | 
    
         
            +
                "ext/json/ext/fbuffer/fbuffer.h",
         
     | 
| 
      
 23 
     | 
    
         
            +
                "ext/json/ext/generator/depend",
         
     | 
| 
      
 24 
     | 
    
         
            +
                "ext/json/ext/generator/extconf.rb",
         
     | 
| 
      
 25 
     | 
    
         
            +
                "ext/json/ext/generator/generator.c",
         
     | 
| 
      
 26 
     | 
    
         
            +
                "ext/json/ext/generator/generator.h",
         
     | 
| 
      
 27 
     | 
    
         
            +
                "ext/json/ext/parser/depend",
         
     | 
| 
      
 28 
     | 
    
         
            +
                "ext/json/ext/parser/extconf.rb",
         
     | 
| 
      
 29 
     | 
    
         
            +
                "ext/json/ext/parser/parser.c",
         
     | 
| 
      
 30 
     | 
    
         
            +
                "ext/json/ext/parser/parser.h",
         
     | 
| 
      
 31 
     | 
    
         
            +
                "ext/json/ext/parser/parser.rl",
         
     | 
| 
      
 32 
     | 
    
         
            +
                "ext/json/extconf.rb",
         
     | 
| 
      
 33 
     | 
    
         
            +
                "json.gemspec",
         
     | 
| 
      
 34 
     | 
    
         
            +
                "lib/json.rb",
         
     | 
| 
      
 35 
     | 
    
         
            +
                "lib/json/add/bigdecimal.rb",
         
     | 
| 
      
 36 
     | 
    
         
            +
                "lib/json/add/complex.rb",
         
     | 
| 
      
 37 
     | 
    
         
            +
                "lib/json/add/core.rb",
         
     | 
| 
      
 38 
     | 
    
         
            +
                "lib/json/add/date.rb",
         
     | 
| 
      
 39 
     | 
    
         
            +
                "lib/json/add/date_time.rb",
         
     | 
| 
      
 40 
     | 
    
         
            +
                "lib/json/add/exception.rb",
         
     | 
| 
      
 41 
     | 
    
         
            +
                "lib/json/add/ostruct.rb",
         
     | 
| 
      
 42 
     | 
    
         
            +
                "lib/json/add/range.rb",
         
     | 
| 
      
 43 
     | 
    
         
            +
                "lib/json/add/rational.rb",
         
     | 
| 
      
 44 
     | 
    
         
            +
                "lib/json/add/regexp.rb",
         
     | 
| 
      
 45 
     | 
    
         
            +
                "lib/json/add/set.rb",
         
     | 
| 
      
 46 
     | 
    
         
            +
                "lib/json/add/struct.rb",
         
     | 
| 
      
 47 
     | 
    
         
            +
                "lib/json/add/symbol.rb",
         
     | 
| 
      
 48 
     | 
    
         
            +
                "lib/json/add/time.rb",
         
     | 
| 
      
 49 
     | 
    
         
            +
                "lib/json/common.rb",
         
     | 
| 
      
 50 
     | 
    
         
            +
                "lib/json/ext.rb",
         
     | 
| 
      
 51 
     | 
    
         
            +
                "lib/json/generic_object.rb",
         
     | 
| 
      
 52 
     | 
    
         
            +
                "lib/json/pure.rb",
         
     | 
| 
      
 53 
     | 
    
         
            +
                "lib/json/pure/generator.rb",
         
     | 
| 
      
 54 
     | 
    
         
            +
                "lib/json/pure/parser.rb",
         
     | 
| 
      
 55 
     | 
    
         
            +
                "lib/json/version.rb",
         
     | 
| 
      
 56 
     | 
    
         
            +
              ]
         
     | 
| 
      
 57 
     | 
    
         
            +
              s.homepage = "https://flori.github.io/json"
         
     | 
| 
      
 58 
     | 
    
         
            +
              s.metadata = {
         
     | 
| 
      
 59 
     | 
    
         
            +
                'bug_tracker_uri'   => 'https://github.com/flori/json/issues',
         
     | 
| 
      
 60 
     | 
    
         
            +
                'changelog_uri'     => 'https://github.com/flori/json/blob/master/CHANGES.md',
         
     | 
| 
      
 61 
     | 
    
         
            +
                'documentation_uri' => 'https://flori.github.io/json/doc/index.html',
         
     | 
| 
      
 62 
     | 
    
         
            +
                'homepage_uri'      => s.homepage,
         
     | 
| 
      
 63 
     | 
    
         
            +
                'source_code_uri'   => 'https://github.com/flori/json',
         
     | 
| 
      
 64 
     | 
    
         
            +
                'wiki_uri'          => 'https://github.com/flori/json/wiki'
         
     | 
| 
      
 65 
     | 
    
         
            +
              }
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
              s.required_ruby_version = Gem::Requirement.new(">= 2.3")
         
     | 
| 
      
 68 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,58 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
            begin
         
     | 
| 
      
 6 
     | 
    
         
            +
              require 'bigdecimal'
         
     | 
| 
      
 7 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            class BigDecimal
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 13 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 14 
     | 
    
         
            +
                BigDecimal._load object['b']
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              # Methods <tt>BigDecimal#as_json</tt> and +BigDecimal.json_create+ may be used
         
     | 
| 
      
 18 
     | 
    
         
            +
              # to serialize and deserialize a \BigDecimal object;
         
     | 
| 
      
 19 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 20 
     | 
    
         
            +
              #
         
     | 
| 
      
 21 
     | 
    
         
            +
              # \Method <tt>BigDecimal#as_json</tt> serializes +self+,
         
     | 
| 
      
 22 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              #   require 'json/add/bigdecimal'
         
     | 
| 
      
 25 
     | 
    
         
            +
              #   x = BigDecimal(2).as_json             # => {"json_class"=>"BigDecimal", "b"=>"27:0.2e1"}
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   y = BigDecimal(2.0, 4).as_json        # => {"json_class"=>"BigDecimal", "b"=>"36:0.2e1"}
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   z = BigDecimal(Complex(2, 0)).as_json # => {"json_class"=>"BigDecimal", "b"=>"27:0.2e1"}
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \BigDecimal object:
         
     | 
| 
      
 30 
     | 
    
         
            +
              #
         
     | 
| 
      
 31 
     | 
    
         
            +
              #   BigDecimal.json_create(x) # => 0.2e1
         
     | 
| 
      
 32 
     | 
    
         
            +
              #   BigDecimal.json_create(y) # => 0.2e1
         
     | 
| 
      
 33 
     | 
    
         
            +
              #   BigDecimal.json_create(z) # => 0.2e1
         
     | 
| 
      
 34 
     | 
    
         
            +
              #
         
     | 
| 
      
 35 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 36 
     | 
    
         
            +
                {
         
     | 
| 
      
 37 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  'b'            => _dump,
         
     | 
| 
      
 39 
     | 
    
         
            +
                }
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 43 
     | 
    
         
            +
              #
         
     | 
| 
      
 44 
     | 
    
         
            +
              #   require 'json/add/bigdecimal'
         
     | 
| 
      
 45 
     | 
    
         
            +
              #   puts BigDecimal(2).to_json
         
     | 
| 
      
 46 
     | 
    
         
            +
              #   puts BigDecimal(2.0, 4).to_json
         
     | 
| 
      
 47 
     | 
    
         
            +
              #   puts BigDecimal(Complex(2, 0)).to_json
         
     | 
| 
      
 48 
     | 
    
         
            +
              #
         
     | 
| 
      
 49 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 50 
     | 
    
         
            +
              #
         
     | 
| 
      
 51 
     | 
    
         
            +
              #   {"json_class":"BigDecimal","b":"27:0.2e1"}
         
     | 
| 
      
 52 
     | 
    
         
            +
              #   {"json_class":"BigDecimal","b":"36:0.2e1"}
         
     | 
| 
      
 53 
     | 
    
         
            +
              #   {"json_class":"BigDecimal","b":"27:0.2e1"}
         
     | 
| 
      
 54 
     | 
    
         
            +
              #
         
     | 
| 
      
 55 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 56 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
            end if defined?(::BigDecimal)
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Complex
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 9 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                Complex(object['r'], object['i'])
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              # Methods <tt>Complex#as_json</tt> and +Complex.json_create+ may be used
         
     | 
| 
      
 14 
     | 
    
         
            +
              # to serialize and deserialize a \Complex object;
         
     | 
| 
      
 15 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 16 
     | 
    
         
            +
              #
         
     | 
| 
      
 17 
     | 
    
         
            +
              # \Method <tt>Complex#as_json</tt> serializes +self+,
         
     | 
| 
      
 18 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   require 'json/add/complex'
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   x = Complex(2).as_json      # => {"json_class"=>"Complex", "r"=>2, "i"=>0}
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   y = Complex(2.0, 4).as_json # => {"json_class"=>"Complex", "r"=>2.0, "i"=>4}
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Complex object:
         
     | 
| 
      
 25 
     | 
    
         
            +
              #
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   Complex.json_create(x) # => (2+0i)
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   Complex.json_create(y) # => (2.0+4i)
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 30 
     | 
    
         
            +
                {
         
     | 
| 
      
 31 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 32 
     | 
    
         
            +
                  'r'            => real,
         
     | 
| 
      
 33 
     | 
    
         
            +
                  'i'            => imag,
         
     | 
| 
      
 34 
     | 
    
         
            +
                }
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 38 
     | 
    
         
            +
              #
         
     | 
| 
      
 39 
     | 
    
         
            +
              #   require 'json/add/complex'
         
     | 
| 
      
 40 
     | 
    
         
            +
              #   puts Complex(2).to_json
         
     | 
| 
      
 41 
     | 
    
         
            +
              #   puts Complex(2.0, 4).to_json
         
     | 
| 
      
 42 
     | 
    
         
            +
              #
         
     | 
| 
      
 43 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 44 
     | 
    
         
            +
              #
         
     | 
| 
      
 45 
     | 
    
         
            +
              #   {"json_class":"Complex","r":2,"i":0}
         
     | 
| 
      
 46 
     | 
    
         
            +
              #   {"json_class":"Complex","r":2.0,"i":4}
         
     | 
| 
      
 47 
     | 
    
         
            +
              #
         
     | 
| 
      
 48 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 49 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            # This file requires the implementations of ruby core's custom objects for
         
     | 
| 
      
 3 
     | 
    
         
            +
            # serialisation/deserialisation.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'json/add/date'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'json/add/date_time'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'json/add/exception'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'json/add/range'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'json/add/regexp'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'json/add/struct'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'json/add/symbol'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require 'json/add/time'
         
     | 
| 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'date'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class Date
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 10 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 11 
     | 
    
         
            +
                civil(*object.values_at('y', 'm', 'd', 'sg'))
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              alias start sg unless method_defined?(:start)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              # Methods <tt>Date#as_json</tt> and +Date.json_create+ may be used
         
     | 
| 
      
 17 
     | 
    
         
            +
              # to serialize and deserialize a \Date object;
         
     | 
| 
      
 18 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              # \Method <tt>Date#as_json</tt> serializes +self+,
         
     | 
| 
      
 21 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 22 
     | 
    
         
            +
              #
         
     | 
| 
      
 23 
     | 
    
         
            +
              #   require 'json/add/date'
         
     | 
| 
      
 24 
     | 
    
         
            +
              #   x = Date.today.as_json
         
     | 
| 
      
 25 
     | 
    
         
            +
              #   # => {"json_class"=>"Date", "y"=>2023, "m"=>11, "d"=>21, "sg"=>2299161.0}
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Date object:
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              #   Date.json_create(x)
         
     | 
| 
      
 30 
     | 
    
         
            +
              #   # => #<Date: 2023-11-21 ((2460270j,0s,0n),+0s,2299161j)>
         
     | 
| 
      
 31 
     | 
    
         
            +
              #
         
     | 
| 
      
 32 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 33 
     | 
    
         
            +
                {
         
     | 
| 
      
 34 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 35 
     | 
    
         
            +
                  'y' => year,
         
     | 
| 
      
 36 
     | 
    
         
            +
                  'm' => month,
         
     | 
| 
      
 37 
     | 
    
         
            +
                  'd' => day,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  'sg' => start,
         
     | 
| 
      
 39 
     | 
    
         
            +
                }
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 43 
     | 
    
         
            +
              #
         
     | 
| 
      
 44 
     | 
    
         
            +
              #   require 'json/add/date'
         
     | 
| 
      
 45 
     | 
    
         
            +
              #   puts Date.today.to_json
         
     | 
| 
      
 46 
     | 
    
         
            +
              #
         
     | 
| 
      
 47 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 48 
     | 
    
         
            +
              #
         
     | 
| 
      
 49 
     | 
    
         
            +
              #   {"json_class":"Date","y":2023,"m":11,"d":21,"sg":2299161.0}
         
     | 
| 
      
 50 
     | 
    
         
            +
              #
         
     | 
| 
      
 51 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 52 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,67 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'date'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class DateTime
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 10 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 11 
     | 
    
         
            +
                args = object.values_at('y', 'm', 'd', 'H', 'M', 'S')
         
     | 
| 
      
 12 
     | 
    
         
            +
                of_a, of_b = object['of'].split('/')
         
     | 
| 
      
 13 
     | 
    
         
            +
                if of_b and of_b != '0'
         
     | 
| 
      
 14 
     | 
    
         
            +
                  args << Rational(of_a.to_i, of_b.to_i)
         
     | 
| 
      
 15 
     | 
    
         
            +
                else
         
     | 
| 
      
 16 
     | 
    
         
            +
                  args << of_a
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
                args << object['sg']
         
     | 
| 
      
 19 
     | 
    
         
            +
                civil(*args)
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              alias start sg unless method_defined?(:start)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              # Methods <tt>DateTime#as_json</tt> and +DateTime.json_create+ may be used
         
     | 
| 
      
 25 
     | 
    
         
            +
              # to serialize and deserialize a \DateTime object;
         
     | 
| 
      
 26 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 27 
     | 
    
         
            +
              #
         
     | 
| 
      
 28 
     | 
    
         
            +
              # \Method <tt>DateTime#as_json</tt> serializes +self+,
         
     | 
| 
      
 29 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 30 
     | 
    
         
            +
              #
         
     | 
| 
      
 31 
     | 
    
         
            +
              #   require 'json/add/datetime'
         
     | 
| 
      
 32 
     | 
    
         
            +
              #   x = DateTime.now.as_json
         
     | 
| 
      
 33 
     | 
    
         
            +
              #   # => {"json_class"=>"DateTime", "y"=>2023, "m"=>11, "d"=>21, "sg"=>2299161.0}
         
     | 
| 
      
 34 
     | 
    
         
            +
              #
         
     | 
| 
      
 35 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \DateTime object:
         
     | 
| 
      
 36 
     | 
    
         
            +
              #
         
     | 
| 
      
 37 
     | 
    
         
            +
              #   DateTime.json_create(x) # BUG? Raises Date::Error "invalid date"
         
     | 
| 
      
 38 
     | 
    
         
            +
              #
         
     | 
| 
      
 39 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 40 
     | 
    
         
            +
                {
         
     | 
| 
      
 41 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 42 
     | 
    
         
            +
                  'y' => year,
         
     | 
| 
      
 43 
     | 
    
         
            +
                  'm' => month,
         
     | 
| 
      
 44 
     | 
    
         
            +
                  'd' => day,
         
     | 
| 
      
 45 
     | 
    
         
            +
                  'H' => hour,
         
     | 
| 
      
 46 
     | 
    
         
            +
                  'M' => min,
         
     | 
| 
      
 47 
     | 
    
         
            +
                  'S' => sec,
         
     | 
| 
      
 48 
     | 
    
         
            +
                  'of' => offset.to_s,
         
     | 
| 
      
 49 
     | 
    
         
            +
                  'sg' => start,
         
     | 
| 
      
 50 
     | 
    
         
            +
                }
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 54 
     | 
    
         
            +
              #
         
     | 
| 
      
 55 
     | 
    
         
            +
              #   require 'json/add/datetime'
         
     | 
| 
      
 56 
     | 
    
         
            +
              #   puts DateTime.now.to_json
         
     | 
| 
      
 57 
     | 
    
         
            +
              #
         
     | 
| 
      
 58 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 59 
     | 
    
         
            +
              #
         
     | 
| 
      
 60 
     | 
    
         
            +
              #   {"json_class":"DateTime","y":2023,"m":11,"d":21,"sg":2299161.0}
         
     | 
| 
      
 61 
     | 
    
         
            +
              #
         
     | 
| 
      
 62 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 63 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
            end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,49 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Exception
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 9 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                result = new(object['m'])
         
     | 
| 
      
 11 
     | 
    
         
            +
                result.set_backtrace object['b']
         
     | 
| 
      
 12 
     | 
    
         
            +
                result
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              # Methods <tt>Exception#as_json</tt> and +Exception.json_create+ may be used
         
     | 
| 
      
 16 
     | 
    
         
            +
              # to serialize and deserialize a \Exception object;
         
     | 
| 
      
 17 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 18 
     | 
    
         
            +
              #
         
     | 
| 
      
 19 
     | 
    
         
            +
              # \Method <tt>Exception#as_json</tt> serializes +self+,
         
     | 
| 
      
 20 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 21 
     | 
    
         
            +
              #
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   require 'json/add/exception'
         
     | 
| 
      
 23 
     | 
    
         
            +
              #   x = Exception.new('Foo').as_json # => {"json_class"=>"Exception", "m"=>"Foo", "b"=>nil}
         
     | 
| 
      
 24 
     | 
    
         
            +
              #
         
     | 
| 
      
 25 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Exception object:
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   Exception.json_create(x) # => #<Exception: Foo>
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 30 
     | 
    
         
            +
                {
         
     | 
| 
      
 31 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 32 
     | 
    
         
            +
                  'm'            => message,
         
     | 
| 
      
 33 
     | 
    
         
            +
                  'b'            => backtrace,
         
     | 
| 
      
 34 
     | 
    
         
            +
                }
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 38 
     | 
    
         
            +
              #
         
     | 
| 
      
 39 
     | 
    
         
            +
              #   require 'json/add/exception'
         
     | 
| 
      
 40 
     | 
    
         
            +
              #   puts Exception.new('Foo').to_json
         
     | 
| 
      
 41 
     | 
    
         
            +
              #
         
     | 
| 
      
 42 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 43 
     | 
    
         
            +
              #
         
     | 
| 
      
 44 
     | 
    
         
            +
              #   {"json_class":"Exception","m":"Foo","b":null}
         
     | 
| 
      
 45 
     | 
    
         
            +
              #
         
     | 
| 
      
 46 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 47 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
            begin
         
     | 
| 
      
 6 
     | 
    
         
            +
              require 'ostruct'
         
     | 
| 
      
 7 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            class OpenStruct
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 13 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 14 
     | 
    
         
            +
                new(object['t'] || object[:t])
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              # Methods <tt>OpenStruct#as_json</tt> and +OpenStruct.json_create+ may be used
         
     | 
| 
      
 18 
     | 
    
         
            +
              # to serialize and deserialize a \OpenStruct object;
         
     | 
| 
      
 19 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 20 
     | 
    
         
            +
              #
         
     | 
| 
      
 21 
     | 
    
         
            +
              # \Method <tt>OpenStruct#as_json</tt> serializes +self+,
         
     | 
| 
      
 22 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              #   require 'json/add/ostruct'
         
     | 
| 
      
 25 
     | 
    
         
            +
              #   x = OpenStruct.new('name' => 'Rowdy', :age => nil).as_json
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   # => {"json_class"=>"OpenStruct", "t"=>{:name=>'Rowdy', :age=>nil}}
         
     | 
| 
      
 27 
     | 
    
         
            +
              #
         
     | 
| 
      
 28 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \OpenStruct object:
         
     | 
| 
      
 29 
     | 
    
         
            +
              #
         
     | 
| 
      
 30 
     | 
    
         
            +
              #   OpenStruct.json_create(x)
         
     | 
| 
      
 31 
     | 
    
         
            +
              #   # => #<OpenStruct name='Rowdy', age=nil>
         
     | 
| 
      
 32 
     | 
    
         
            +
              #
         
     | 
| 
      
 33 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 34 
     | 
    
         
            +
                klass = self.class.name
         
     | 
| 
      
 35 
     | 
    
         
            +
                klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
         
     | 
| 
      
 36 
     | 
    
         
            +
                {
         
     | 
| 
      
 37 
     | 
    
         
            +
                  JSON.create_id => klass,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  't'            => table,
         
     | 
| 
      
 39 
     | 
    
         
            +
                }
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 43 
     | 
    
         
            +
              #
         
     | 
| 
      
 44 
     | 
    
         
            +
              #   require 'json/add/ostruct'
         
     | 
| 
      
 45 
     | 
    
         
            +
              #   puts OpenStruct.new('name' => 'Rowdy', :age => nil).to_json
         
     | 
| 
      
 46 
     | 
    
         
            +
              #
         
     | 
| 
      
 47 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 48 
     | 
    
         
            +
              #
         
     | 
| 
      
 49 
     | 
    
         
            +
              #   {"json_class":"OpenStruct","t":{'name':'Rowdy',"age":null}}
         
     | 
| 
      
 50 
     | 
    
         
            +
              #
         
     | 
| 
      
 51 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 52 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end if defined?(::OpenStruct)
         
     | 
| 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Range
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 9 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                new(*object['a'])
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              # Methods <tt>Range#as_json</tt> and +Range.json_create+ may be used
         
     | 
| 
      
 14 
     | 
    
         
            +
              # to serialize and deserialize a \Range object;
         
     | 
| 
      
 15 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 16 
     | 
    
         
            +
              #
         
     | 
| 
      
 17 
     | 
    
         
            +
              # \Method <tt>Range#as_json</tt> serializes +self+,
         
     | 
| 
      
 18 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   require 'json/add/range'
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   x = (1..4).as_json     # => {"json_class"=>"Range", "a"=>[1, 4, false]}
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   y = (1...4).as_json    # => {"json_class"=>"Range", "a"=>[1, 4, true]}
         
     | 
| 
      
 23 
     | 
    
         
            +
              #   z = ('a'..'d').as_json # => {"json_class"=>"Range", "a"=>["a", "d", false]}
         
     | 
| 
      
 24 
     | 
    
         
            +
              #
         
     | 
| 
      
 25 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Range object:
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   Range.json_create(x) # => 1..4
         
     | 
| 
      
 28 
     | 
    
         
            +
              #   Range.json_create(y) # => 1...4
         
     | 
| 
      
 29 
     | 
    
         
            +
              #   Range.json_create(z) # => "a".."d"
         
     | 
| 
      
 30 
     | 
    
         
            +
              #
         
     | 
| 
      
 31 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 32 
     | 
    
         
            +
                {
         
     | 
| 
      
 33 
     | 
    
         
            +
                  JSON.create_id  => self.class.name,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  'a'             => [ first, last, exclude_end? ]
         
     | 
| 
      
 35 
     | 
    
         
            +
                }
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 39 
     | 
    
         
            +
              #
         
     | 
| 
      
 40 
     | 
    
         
            +
              #   require 'json/add/range'
         
     | 
| 
      
 41 
     | 
    
         
            +
              #   puts (1..4).to_json
         
     | 
| 
      
 42 
     | 
    
         
            +
              #   puts (1...4).to_json
         
     | 
| 
      
 43 
     | 
    
         
            +
              #   puts ('a'..'d').to_json
         
     | 
| 
      
 44 
     | 
    
         
            +
              #
         
     | 
| 
      
 45 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 46 
     | 
    
         
            +
              #
         
     | 
| 
      
 47 
     | 
    
         
            +
              #   {"json_class":"Range","a":[1,4,false]}
         
     | 
| 
      
 48 
     | 
    
         
            +
              #   {"json_class":"Range","a":[1,4,true]}
         
     | 
| 
      
 49 
     | 
    
         
            +
              #   {"json_class":"Range","a":["a","d",false]}
         
     | 
| 
      
 50 
     | 
    
         
            +
              #
         
     | 
| 
      
 51 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 52 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,49 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Rational
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 9 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                Rational(object['n'], object['d'])
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              # Methods <tt>Rational#as_json</tt> and +Rational.json_create+ may be used
         
     | 
| 
      
 14 
     | 
    
         
            +
              # to serialize and deserialize a \Rational object;
         
     | 
| 
      
 15 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 16 
     | 
    
         
            +
              #
         
     | 
| 
      
 17 
     | 
    
         
            +
              # \Method <tt>Rational#as_json</tt> serializes +self+,
         
     | 
| 
      
 18 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   require 'json/add/rational'
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   x = Rational(2, 3).as_json
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   # => {"json_class"=>"Rational", "n"=>2, "d"=>3}
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Rational object:
         
     | 
| 
      
 25 
     | 
    
         
            +
              #
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   Rational.json_create(x)
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   # => (2/3)
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 30 
     | 
    
         
            +
                {
         
     | 
| 
      
 31 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 32 
     | 
    
         
            +
                  'n'            => numerator,
         
     | 
| 
      
 33 
     | 
    
         
            +
                  'd'            => denominator,
         
     | 
| 
      
 34 
     | 
    
         
            +
                }
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 38 
     | 
    
         
            +
              #
         
     | 
| 
      
 39 
     | 
    
         
            +
              #   require 'json/add/rational'
         
     | 
| 
      
 40 
     | 
    
         
            +
              #   puts Rational(2, 3).to_json
         
     | 
| 
      
 41 
     | 
    
         
            +
              #
         
     | 
| 
      
 42 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 43 
     | 
    
         
            +
              #
         
     | 
| 
      
 44 
     | 
    
         
            +
              #   {"json_class":"Rational","n":2,"d":3}
         
     | 
| 
      
 45 
     | 
    
         
            +
              #
         
     | 
| 
      
 46 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 47 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Regexp
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 9 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                new(object['s'], object['o'])
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              # Methods <tt>Regexp#as_json</tt> and +Regexp.json_create+ may be used
         
     | 
| 
      
 14 
     | 
    
         
            +
              # to serialize and deserialize a \Regexp object;
         
     | 
| 
      
 15 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 16 
     | 
    
         
            +
              #
         
     | 
| 
      
 17 
     | 
    
         
            +
              # \Method <tt>Regexp#as_json</tt> serializes +self+,
         
     | 
| 
      
 18 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   require 'json/add/regexp'
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   x = /foo/.as_json
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   # => {"json_class"=>"Regexp", "o"=>0, "s"=>"foo"}
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Regexp object:
         
     | 
| 
      
 25 
     | 
    
         
            +
              #
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   Regexp.json_create(x) # => /foo/
         
     | 
| 
      
 27 
     | 
    
         
            +
              #
         
     | 
| 
      
 28 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 29 
     | 
    
         
            +
                {
         
     | 
| 
      
 30 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 31 
     | 
    
         
            +
                  'o'            => options,
         
     | 
| 
      
 32 
     | 
    
         
            +
                  's'            => source,
         
     | 
| 
      
 33 
     | 
    
         
            +
                }
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 37 
     | 
    
         
            +
              #
         
     | 
| 
      
 38 
     | 
    
         
            +
              #   require 'json/add/regexp'
         
     | 
| 
      
 39 
     | 
    
         
            +
              #   puts /foo/.to_json
         
     | 
| 
      
 40 
     | 
    
         
            +
              #
         
     | 
| 
      
 41 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 42 
     | 
    
         
            +
              #
         
     | 
| 
      
 43 
     | 
    
         
            +
              #    {"json_class":"Regexp","o":0,"s":"foo"}
         
     | 
| 
      
 44 
     | 
    
         
            +
              #
         
     | 
| 
      
 45 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 46 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/json/add/set.rb
    ADDED
    
    | 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 2 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 3 
     | 
    
         
            +
            end
         
     | 
| 
      
 4 
     | 
    
         
            +
            defined?(::Set) or require 'set'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Set
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 9 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                new object['a']
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              # Methods <tt>Set#as_json</tt> and +Set.json_create+ may be used
         
     | 
| 
      
 14 
     | 
    
         
            +
              # to serialize and deserialize a \Set object;
         
     | 
| 
      
 15 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 16 
     | 
    
         
            +
              #
         
     | 
| 
      
 17 
     | 
    
         
            +
              # \Method <tt>Set#as_json</tt> serializes +self+,
         
     | 
| 
      
 18 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   require 'json/add/set'
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   x = Set.new(%w/foo bar baz/).as_json
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   # => {"json_class"=>"Set", "a"=>["foo", "bar", "baz"]}
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Set object:
         
     | 
| 
      
 25 
     | 
    
         
            +
              #
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   Set.json_create(x) # => #<Set: {"foo", "bar", "baz"}>
         
     | 
| 
      
 27 
     | 
    
         
            +
              #
         
     | 
| 
      
 28 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 29 
     | 
    
         
            +
                {
         
     | 
| 
      
 30 
     | 
    
         
            +
                  JSON.create_id => self.class.name,
         
     | 
| 
      
 31 
     | 
    
         
            +
                  'a'            => to_a,
         
     | 
| 
      
 32 
     | 
    
         
            +
                }
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 36 
     | 
    
         
            +
              #
         
     | 
| 
      
 37 
     | 
    
         
            +
              #   require 'json/add/set'
         
     | 
| 
      
 38 
     | 
    
         
            +
              #   puts Set.new(%w/foo bar baz/).to_json
         
     | 
| 
      
 39 
     | 
    
         
            +
              #
         
     | 
| 
      
 40 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 41 
     | 
    
         
            +
              #
         
     | 
| 
      
 42 
     | 
    
         
            +
              #   {"json_class":"Set","a":["foo","bar","baz"]}
         
     | 
| 
      
 43 
     | 
    
         
            +
              #
         
     | 
| 
      
 44 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 45 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
            end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #frozen_string_literal: false
         
     | 
| 
      
 2 
     | 
    
         
            +
            unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
         
     | 
| 
      
 3 
     | 
    
         
            +
              require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
            end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Struct
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              # See #as_json.
         
     | 
| 
      
 9 
     | 
    
         
            +
              def self.json_create(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                new(*object['v'])
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              # Methods <tt>Struct#as_json</tt> and +Struct.json_create+ may be used
         
     | 
| 
      
 14 
     | 
    
         
            +
              # to serialize and deserialize a \Struct object;
         
     | 
| 
      
 15 
     | 
    
         
            +
              # see Marshal[https://docs.ruby-lang.org/en/master/Marshal.html].
         
     | 
| 
      
 16 
     | 
    
         
            +
              #
         
     | 
| 
      
 17 
     | 
    
         
            +
              # \Method <tt>Struct#as_json</tt> serializes +self+,
         
     | 
| 
      
 18 
     | 
    
         
            +
              # returning a 2-element hash representing +self+:
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   require 'json/add/struct'
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   Customer = Struct.new('Customer', :name, :address, :zip)
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   x = Struct::Customer.new.as_json
         
     | 
| 
      
 23 
     | 
    
         
            +
              #   # => {"json_class"=>"Struct::Customer", "v"=>[nil, nil, nil]}
         
     | 
| 
      
 24 
     | 
    
         
            +
              #
         
     | 
| 
      
 25 
     | 
    
         
            +
              # \Method +JSON.create+ deserializes such a hash, returning a \Struct object:
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   Struct::Customer.json_create(x)
         
     | 
| 
      
 28 
     | 
    
         
            +
              #   # => #<struct Struct::Customer name=nil, address=nil, zip=nil>
         
     | 
| 
      
 29 
     | 
    
         
            +
              #
         
     | 
| 
      
 30 
     | 
    
         
            +
              def as_json(*)
         
     | 
| 
      
 31 
     | 
    
         
            +
                klass = self.class.name
         
     | 
| 
      
 32 
     | 
    
         
            +
                klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
         
     | 
| 
      
 33 
     | 
    
         
            +
                {
         
     | 
| 
      
 34 
     | 
    
         
            +
                  JSON.create_id => klass,
         
     | 
| 
      
 35 
     | 
    
         
            +
                  'v'            => values,
         
     | 
| 
      
 36 
     | 
    
         
            +
                }
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              # Returns a JSON string representing +self+:
         
     | 
| 
      
 40 
     | 
    
         
            +
              #
         
     | 
| 
      
 41 
     | 
    
         
            +
              #   require 'json/add/struct'
         
     | 
| 
      
 42 
     | 
    
         
            +
              #   Customer = Struct.new('Customer', :name, :address, :zip)
         
     | 
| 
      
 43 
     | 
    
         
            +
              #   puts Struct::Customer.new.to_json
         
     | 
| 
      
 44 
     | 
    
         
            +
              #
         
     | 
| 
      
 45 
     | 
    
         
            +
              # Output:
         
     | 
| 
      
 46 
     | 
    
         
            +
              #
         
     | 
| 
      
 47 
     | 
    
         
            +
              #   {"json_class":"Struct","t":{'name':'Rowdy',"age":null}}
         
     | 
| 
      
 48 
     | 
    
         
            +
              #
         
     | 
| 
      
 49 
     | 
    
         
            +
              def to_json(*args)
         
     | 
| 
      
 50 
     | 
    
         
            +
                as_json.to_json(*args)
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
            end
         
     |