mighty_json 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 15d2f5dff6d3f941811d37ee84d8e789e3aa0160
4
+ data.tar.gz: 18d8272bff2142be7f5842be8c32af429280ad5a
5
+ SHA512:
6
+ metadata.gz: 6bb832dac8163b344f5be5eda23f24ff0f901242af6886b5cffcbceabd1938248867adb4c75539ab8eb666348a5f97cfc94451f4ffb6350cefad86c1d9a319a0
7
+ data.tar.gz: c4b59eeeedab80b5964c544e05e566fec55e21269b0d68c2c68efab95c42e2bb162b2d8073b2fbeac7339fd0e52034cf315834cec33d9ec7baa53aff667a63b3
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.3.4"
4
+ - "2.4.1"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in mighty_json.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Masataka Kuwabara
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,24 @@
1
+ https://github.com/soutaro/strong_json
2
+
3
+ Copyright (c) 2014 Soutaro Matsumoto
4
+
5
+ MIT License
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ "Software"), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be
16
+ included in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # MightyJSON
2
+
3
+ A faster implementation of [soutaro/strong_json](https://github.com/soutaro/strong_json).
4
+
5
+ ## Benchmarking
6
+
7
+ - In complex case, MightyJSON is faster 2.8x than StrongJSON ([code](https://github.com/pocke/mighty_json/blob/master/benchmarks/large.rb)).
8
+ - In simple case, MightyJSON is faster around 2x ~ 10x than StrongJSON ([code](https://github.com/pocke/mighty_json/blob/master/benchmarks/small.rb)).
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'mighty_json'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install mighty_json
25
+
26
+ ## Usage
27
+
28
+ See [soutaro/strong_json](https://github.com/soutaro/strong_json/blob/master/README.md).
29
+
30
+ ## Compatibility
31
+
32
+ MightyJSON does not have the following methods.
33
+
34
+ - `Type::Object#merge`
35
+ - `Type::Object#except`
36
+ - `Type::*#coerce`
37
+ - `Type::*#===`
38
+ - `Type::*#=~`
39
+
40
+ MightyJSON does not support literal type that is not serializable by `Object#inspect` method.
41
+
42
+
43
+ ## License
44
+
45
+ See [LICENSE.txt](https://github.com/pocke/mighty_json/blob/master/LICENSE.txt) and [LICENSE.txt.original](https://github.com/pocke/mighty_json/blob/master/LICENSE.txt.original).
46
+ This code bases [soutaro/strong_json](https://github.com/soutaro/strong_json).
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+ task :default => :test
4
+
5
+ Rake::TestTask.new do |test|
6
+ test.libs << 'test'
7
+ test.test_files = Dir['test/**/test_*.rb']
8
+ test.verbose = true
9
+ end
@@ -0,0 +1,47 @@
1
+ # Usage:
2
+ # # The json is result of RuboCop in Readmine project
3
+ # $ ruby large.rb json
4
+ #
5
+ # Result:
6
+ # user system total real
7
+ # StrongJSON 11.140000 0.020000 11.160000 ( 11.152806)
8
+ # MightyJSON 4.340000 0.010000 4.350000 ( 4.355610)
9
+ #
10
+ # Environment:
11
+ # - StrongJSON: v0.4.0
12
+ # - MightyJSON: 7c4c34fff3e24a9573bc8397985d4080eee87359
13
+ # - Ruby 2.4.1
14
+ # - Arch Linux
15
+ # - Core i7-6700K
16
+
17
+ require 'json'
18
+ require 'mighty_json'
19
+ require 'strong_json'
20
+ require 'benchmark'
21
+
22
+ s = StrongJSON.new do
23
+ let :metadata, object(rubocop_version: string, ruby_engine: string, ruby_version: string, ruby_patchlevel: string, ruby_platform: string)
24
+ let :offense, object(severity: string, message: string, cop_name: string, corrected: boolean, location: object(line: number, column: number, length: number))
25
+ let :file, object(path: string, offenses: array(offense))
26
+ let :summary, object(offense_count: number, target_file_count: number, inspected_file_count: number)
27
+
28
+ let :o, object(metadata: metadata, files: array(file), summary: summary)
29
+ end
30
+
31
+ m = MightyJSON.new do
32
+ let :metadata, object(rubocop_version: string, ruby_engine: string, ruby_version: string, ruby_patchlevel: string, ruby_platform: string)
33
+ let :offense, object(severity: string, message: string, cop_name: string, corrected: boolean, location: object(line: number, column: number, length: number))
34
+ let :file, object(path: string, offenses: array(offense))
35
+ let :summary, object(offense_count: number, target_file_count: number, inspected_file_count: number)
36
+
37
+ let :o, object(metadata: metadata, files: array(file), summary: summary)
38
+ end
39
+
40
+ data = JSON.parse ARGF.read, symbolize_names: true
41
+
42
+ raise 'Invalid' if s.o.coerce(data) != m.o.coerce(data)
43
+
44
+ Benchmark.bm(20) do |x|
45
+ x.report('StrongJSON'){20.times{s.o.coerce(data)}}
46
+ x.report('MightyJSON'){20.times{m.o.coerce(data)}}
47
+ end
@@ -0,0 +1,60 @@
1
+ # Usage:
2
+ # $ ruby small.rb
3
+ #
4
+ # Result:
5
+ # user system total real
6
+ # StrongJSON:object 3.500000 0.000000 3.500000 ( 3.498456)
7
+ # MightyJSON:object 1.740000 0.000000 1.740000 ( 1.737220)
8
+ # StrongJSON:string 1.960000 0.000000 1.960000 ( 1.962529)
9
+ # MightyJSON:string 0.450000 0.000000 0.450000 ( 0.447002)
10
+ # StrongJSON:array 2.290000 0.000000 2.290000 ( 2.295061)
11
+ # MightyJSON:array 1.130000 0.000000 1.130000 ( 1.127846)
12
+ # StrongJSON:enum 5.560000 0.000000 5.560000 ( 5.564537)
13
+ # MightyJSON:enum 2.920000 0.000000 2.920000 ( 2.913830)
14
+ # StrongJSON:optional 2.080000 0.000000 2.080000 ( 2.081410)
15
+ # MightyJSON:optional 0.180000 0.000000 0.180000 ( 0.185282)
16
+ #
17
+ # Environment:
18
+ # - StrongJSON: v0.4.0
19
+ # - MightyJSON: 7c4c34fff3e24a9573bc8397985d4080eee87359
20
+ # - Ruby 2.4.1
21
+ # - Arch Linux
22
+ # - Core i7-6700K
23
+
24
+ require 'mighty_json'
25
+ require 'strong_json'
26
+ require 'benchmark'
27
+
28
+ s = StrongJSON.new do
29
+ let :obj, object(a: string, b: number)
30
+ let :str, string
31
+ let :arr, array(string)
32
+ let :enm, enum(string, number)
33
+ let :opt, string?
34
+ end
35
+
36
+ m = MightyJSON.new do
37
+ let :obj, object(a: string, b: number)
38
+ let :str, string
39
+ let :arr, array(string)
40
+ let :enm, enum(string, number)
41
+ let :opt, string?
42
+ end
43
+
44
+
45
+ Benchmark.bm(20) do |x|
46
+ x.report('StrongJSON:object') {2000000.times{s.obj.coerce({a: 'foo', b: 42})}}
47
+ x.report('MightyJSON:object') {2000000.times{m.obj.coerce({a: 'foo', b: 42})}}
48
+
49
+ x.report('StrongJSON:string') {5000000.times{s.str.coerce('foo')}}
50
+ x.report('MightyJSON:string') {5000000.times{m.str.coerce('foo')}}
51
+
52
+ x.report('StrongJSON:array') {2000000.times{s.arr.coerce(['foo', 'bar'])}}
53
+ x.report('MightyJSON:array') {2000000.times{m.arr.coerce(['foo', 'bar'])}}
54
+
55
+ x.report('StrongJSON:enum') {2000000.times{s.enm.coerce(1)}}
56
+ x.report('MightyJSON:enum') {2000000.times{m.enm.coerce(1)}}
57
+
58
+ x.report('StrongJSON:optional'){2000000.times{s.enm.coerce('foo')}}
59
+ x.report('MightyJSON:optional'){2000000.times{m.enm.coerce('foo')}}
60
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "mighty_json"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,48 @@
1
+ require "mighty_json/version"
2
+
3
+ module MightyJSON
4
+ class Builder
5
+ NONE = Type::NONE
6
+ def initialize(&block)
7
+ @lets = {}
8
+ instance_eval(&block)
9
+ end
10
+
11
+ def compile💪💪💪
12
+ Struct.new(*@lets.keys).new(
13
+ *@lets.values.map do |type|
14
+ Object.new.tap do |this|
15
+ var = Variable.new
16
+ v = var.cur
17
+ eval <<~END
18
+ def this.coerce(#{v})
19
+ #{type.compile(var: var, path: [])}
20
+ end
21
+
22
+ def this.=~(value)
23
+ coerce(value)
24
+ true
25
+ rescue Error, IllegalTypeError, UnexpectedFieldError
26
+ false
27
+ end
28
+
29
+ def this.===(value)
30
+ coerce(value)
31
+ true
32
+ rescue Error, IllegalTypeError, UnexpectedFieldError
33
+ false
34
+ end
35
+ END
36
+ end
37
+ end
38
+ )
39
+ end
40
+
41
+ def let(name, type)
42
+ @lets[name] = type
43
+ define_singleton_method(name) { type }
44
+ end
45
+
46
+ include MightyJSON::Types
47
+ end
48
+ end
@@ -0,0 +1,45 @@
1
+ module MightyJSON
2
+ class Error < StandardError
3
+ attr_reader :path, :type, :value
4
+
5
+ def initialize(path:, type:, value:)
6
+ @path = path
7
+ @type = type
8
+ @value = value
9
+ end
10
+
11
+ def to_s
12
+ position = path.empty? ? "" : " at .#{path.join('.')}"
13
+ "Expected type of value #{value}#{position} is #{type}"
14
+ end
15
+ alias message to_s
16
+ end
17
+
18
+ class IllegalTypeError < StandardError
19
+ attr_reader :type
20
+
21
+ def initialize(type:)
22
+ @type = type
23
+ end
24
+
25
+ def to_s
26
+ "#{type} can not be put on toplevel"
27
+ end
28
+ alias message to_s
29
+ end
30
+
31
+ class UnexpectedFieldError < StandardError
32
+ attr_reader :path, :value
33
+
34
+ def initialize(path: , value:)
35
+ @path = path
36
+ @value = value
37
+ end
38
+
39
+ def to_s
40
+ position = "#{path.join('.')}"
41
+ "Unexpected field of #{position} (#{value})"
42
+ end
43
+ alias message to_s
44
+ end
45
+ end
@@ -0,0 +1,241 @@
1
+ module MightyJSON
2
+ module Type
3
+ NONE = Object.new
4
+
5
+ class Base
6
+ def initialize(type)
7
+ @type = type
8
+ end
9
+
10
+ def compile(var:, path:)
11
+ v = var.cur
12
+ err = "(raise Error.new(value: #{v}, type: #{self.to_s.inspect}, path: #{path.inspect}))"
13
+ case @type
14
+ when :ignored
15
+ if path == []
16
+ 'raise IllegalTypeError.new(type: :ignored)'
17
+ else
18
+ 'NONE'
19
+ end
20
+ when :any
21
+ v
22
+ when :number
23
+ <<~END
24
+ #{v}.is_a?(Numeric) ?
25
+ #{v} :
26
+ #{err}
27
+ END
28
+ when :string
29
+ <<~END
30
+ #{v}.is_a?(String) ?
31
+ #{v} :
32
+ #{err}
33
+ END
34
+ when :boolean
35
+ <<~END
36
+ #{v} == true || #{v} == false ?
37
+ #{v} :
38
+ #{err}
39
+ END
40
+ when :numeric
41
+ <<~END
42
+ #{v}.is_a?(Numeric) || (#{v}.is_a?(String) && /\\A[-+]?[\\d.]+\\Z/ =~ #{v}) ?
43
+ #{v} :
44
+ #{err}
45
+ END
46
+ when :symbol
47
+ <<~END
48
+ #{v}.is_a?(Symbol) ?
49
+ #{v} :
50
+ #{err}
51
+ END
52
+ else
53
+ err
54
+ end
55
+ end
56
+
57
+ def to_s
58
+ @type.to_s
59
+ end
60
+ end
61
+
62
+ class Optional
63
+ def initialize(type)
64
+ @type = type
65
+ end
66
+
67
+ def compile(var:, path:)
68
+ v = var.cur
69
+ <<~END
70
+ if #{v}.nil? || NONE.equal?(#{v})
71
+ nil
72
+ else
73
+ #{@type.compile(var: var, path: path)}
74
+ end
75
+ END
76
+ end
77
+
78
+ def to_s
79
+ "optinal(#{@type})"
80
+ end
81
+ end
82
+
83
+ class Literal
84
+ def initialize(value)
85
+ @value = value
86
+ end
87
+
88
+ def to_s
89
+ "literal(#{@value})"
90
+ end
91
+
92
+ def compile(var:, path:)
93
+ v = var.cur
94
+ <<~END
95
+ raise Error.new(path: #{path.inspect}, type: #{self.to_s.inspect}, value: #{v}) unless #{@value.inspect} == #{v}
96
+ #{v}
97
+ END
98
+ end
99
+ end
100
+
101
+ class Array
102
+ def initialize(type)
103
+ @type = type
104
+ end
105
+
106
+ def compile(var:, path:)
107
+ v = var.cur
108
+ child = var.next
109
+ <<~END
110
+ begin
111
+ raise Error.new(path: #{path.inspect}, type: #{self.to_s.inspect}, value: #{v}) unless #{v}.is_a?(::Array)
112
+ #{v}.map.with_index do |#{child}, i|
113
+ #{@type.compile(var: var, path: path + [:array_index])} # TODO: optimize path
114
+ end
115
+ end
116
+ END
117
+ end
118
+
119
+ def to_s
120
+ "array(#{@type})"
121
+ end
122
+ end
123
+
124
+ class Object
125
+ def initialize(fields)
126
+ @fields = fields
127
+ end
128
+
129
+ def compile(var:, path:)
130
+ v = var.cur
131
+ keys = @fields.keys.map(&:inspect)
132
+
133
+ result = var.next
134
+ <<~END
135
+ begin
136
+ raise Error.new(path: #{path}, type: #{self.to_s.inspect}, value: object) unless #{v}.is_a?(Hash)
137
+
138
+ {}.tap do |#{result}|
139
+ #{v}.each do |key, value|
140
+ next if #{keys.map{|key| "#{key} == key"}.join('||')}
141
+ raise UnexpectedFieldError.new(path: #{path.inspect} + [key], value: #{v}) # TOOD: optimize path
142
+ end
143
+
144
+ #{
145
+ @fields.map do |key, type|
146
+ new_var = var.next
147
+ <<~END2
148
+ #{new_var} = #{v}.key?(#{key.inspect}) ? #{v}[#{key.inspect}] : NONE
149
+ v = #{type.compile(var: var, path: path + [key])}
150
+ if !NONE.equal?(v) &&
151
+ #{!NONE.equal?(type)} &&
152
+ !(#{type.is_a?(Optional)} && NONE.equal?(#{new_var}))
153
+ #{result}[#{key.inspect}] = v
154
+ end
155
+ END2
156
+ end.join("\n")
157
+ }
158
+ end
159
+ end
160
+ END
161
+ end
162
+
163
+ def to_s
164
+ fields = []
165
+
166
+ @fields.each do |name, type|
167
+ fields << "#{name}: #{type}"
168
+ end
169
+
170
+ "object(#{fields.join(', ')})"
171
+ end
172
+ end
173
+
174
+ class Enum
175
+ attr_reader :types
176
+
177
+ def initialize(types)
178
+ @types = types
179
+ end
180
+
181
+ def compile(var:, path:)
182
+ v = var.cur
183
+ <<~END
184
+ #{@types.map do |type|
185
+ <<~END2.chomp
186
+ begin
187
+ #{type.compile(var: var, path: path)}
188
+ rescue Error, UnexpectedFieldError, IllegalTypeError
189
+ end
190
+ END2
191
+ end.join(' || ')} || (raise Error.new(path: #{path.inspect}, type: #{self.to_s.inspect}, value: #{v}))
192
+ END
193
+ end
194
+
195
+ def to_s
196
+ "enum(#{types.map(&:to_s).join(", ")})"
197
+ end
198
+ end
199
+
200
+ class UnexpectedFieldError < StandardError
201
+ attr_reader :path, :value
202
+
203
+ def initialize(path: , value:)
204
+ @path = path
205
+ @value = value
206
+ end
207
+
208
+ def to_s
209
+ position = "#{path.join('.')}"
210
+ "Unexpected field of #{position} (#{value})"
211
+ end
212
+ end
213
+
214
+ class IllegalTypeError < StandardError
215
+ attr_reader :type
216
+
217
+ def initialize(type:)
218
+ @type = type
219
+ end
220
+
221
+ def to_s
222
+ "#{type} can not be put on toplevel"
223
+ end
224
+ end
225
+
226
+ class Error < StandardError
227
+ attr_reader :path, :type, :value
228
+
229
+ def initialize(path:, type:, value:)
230
+ @path = path
231
+ @type = type
232
+ @value = value
233
+ end
234
+
235
+ def to_s
236
+ position = path.empty? ? "" : " at .#{path.join('.')}"
237
+ "Expected type of value #{value}#{position} is #{type}"
238
+ end
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,87 @@
1
+ module MightyJSON
2
+ module Types
3
+ def object(fields = {})
4
+ Type::Object.new(fields)
5
+ end
6
+
7
+ def array(type = any)
8
+ Type::Array.new(type)
9
+ end
10
+
11
+ def optional(type = any)
12
+ Type::Optional.new(type)
13
+ end
14
+
15
+ def string
16
+ MightyJSON::Type::Base.new(:string)
17
+ end
18
+
19
+ def numeric
20
+ MightyJSON::Type::Base.new(:numeric)
21
+ end
22
+
23
+ def number
24
+ MightyJSON::Type::Base.new(:number)
25
+ end
26
+
27
+ def boolean
28
+ MightyJSON::Type::Base.new(:boolean)
29
+ end
30
+
31
+ def any
32
+ MightyJSON::Type::Base.new(:any)
33
+ end
34
+
35
+ def prohibited
36
+ MightyJSON::Type::Base.new(:prohibited)
37
+ end
38
+
39
+ def symbol
40
+ MightyJSON::Type::Base.new(:symbol)
41
+ end
42
+
43
+ def literal(value)
44
+ MightyJSON::Type::Literal.new(value)
45
+ end
46
+
47
+ def enum(*types)
48
+ MightyJSON::Type::Enum.new(types)
49
+ end
50
+
51
+ def string?
52
+ optional(string)
53
+ end
54
+
55
+ def numeric?
56
+ optional(numeric)
57
+ end
58
+
59
+ def number?
60
+ optional(number)
61
+ end
62
+
63
+ def boolean?
64
+ optional(boolean)
65
+ end
66
+
67
+ def symbol?
68
+ optional(symbol)
69
+ end
70
+
71
+ def ignored
72
+ MightyJSON::Type::Base.new(:ignored)
73
+ end
74
+
75
+ def array?(ty)
76
+ optional(array(ty))
77
+ end
78
+
79
+ def object?(fields)
80
+ optional(object(fields))
81
+ end
82
+
83
+ def literal?(value)
84
+ optional(literal(value))
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,14 @@
1
+ class Variable
2
+ def initialize
3
+ @count = 0
4
+ end
5
+
6
+ def next
7
+ @count += 1
8
+ cur
9
+ end
10
+
11
+ def cur
12
+ "var#{@count}"
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module MightyJSON
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,12 @@
1
+ require "mighty_json/version"
2
+ require 'mighty_json/errors'
3
+ require 'mighty_json/type'
4
+ require 'mighty_json/types'
5
+ require 'mighty_json/builder'
6
+ require 'mighty_json/variable'
7
+
8
+ module MightyJSON
9
+ def self.new(&block)
10
+ Builder.new(&block).compile💪💪💪
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "mighty_json/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mighty_json"
8
+ spec.version = MightyJSON::VERSION
9
+ spec.authors = ["Masataka Kuwabara"]
10
+ spec.email = ["kuwabara@pocke.me"]
11
+
12
+ spec.summary = %q{A faster implementation of soutaro/strong_json}
13
+ spec.description = %q{A faster implementation of soutaro/strong_json}
14
+ spec.homepage = "https://github.com/pocke/mighty_json"
15
+ spec.license = 'MIT'
16
+
17
+ spec.required_ruby_version = '>= 2.3.0'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.15"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+
29
+ spec.add_development_dependency 'minitest'
30
+ spec.add_development_dependency 'minitest-power_assert'
31
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mighty_json
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Masataka Kuwabara
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-05-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-power_assert
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: A faster implementation of soutaro/strong_json
70
+ email:
71
+ - kuwabara@pocke.me
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - LICENSE.txt.original
81
+ - README.md
82
+ - Rakefile
83
+ - benchmarks/large.rb
84
+ - benchmarks/small.rb
85
+ - bin/console
86
+ - bin/setup
87
+ - lib/mighty_json.rb
88
+ - lib/mighty_json/builder.rb
89
+ - lib/mighty_json/errors.rb
90
+ - lib/mighty_json/type.rb
91
+ - lib/mighty_json/types.rb
92
+ - lib/mighty_json/variable.rb
93
+ - lib/mighty_json/version.rb
94
+ - mighty_json.gemspec
95
+ homepage: https://github.com/pocke/mighty_json
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 2.3.0
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.6.10
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: A faster implementation of soutaro/strong_json
119
+ test_files: []