japin 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6af1328d766bf07c478bb43343af6fe83707bf7f4a5f8e8f4ca84a604e9a90f8
4
+ data.tar.gz: 208dcd917e1fe02fbdf9e5c13af89c6ecafc751a5d57c514d29ab78443e0bc30
5
+ SHA512:
6
+ metadata.gz: ca7a61fb1ae1248c6c26372f492eb9e9600ad50e07e24838db668b6a7e89faa9192586cb93f4d001c64df805651565c4ab87df441db7aabf97d12e8a324feb14
7
+ data.tar.gz: 928510debaad76e383a7a3234370a93f3a64ce1d1d4ba763595555117d3095daf24f5c20d52d80b74ad8125c49e79c9e396a2738ede836993b1917d9eff7ec0b
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,17 @@
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-performance
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.7.2
7
+ NewCops: enable
8
+
9
+ Layout/LineLength:
10
+ Max: 120
11
+
12
+ Style/Documentation:
13
+ Enabled: false
14
+
15
+ Metrics/BlockLength:
16
+ Exclude:
17
+ - spec/**/*
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ japin
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.7.2
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in json_api_normalizer.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,79 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ japin (0.1.0)
5
+ lucky_case (~> 1.1.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.2)
11
+ coderay (1.1.3)
12
+ diff-lcs (1.4.4)
13
+ docile (1.3.5)
14
+ lefthook (0.7.6)
15
+ lucky_case (1.1.0)
16
+ method_source (1.0.0)
17
+ parallel (1.20.1)
18
+ parser (3.0.2.0)
19
+ ast (~> 2.4.1)
20
+ pry (0.14.1)
21
+ coderay (~> 1.1)
22
+ method_source (~> 1.0)
23
+ rainbow (3.0.0)
24
+ regexp_parser (2.1.1)
25
+ rexml (3.2.5)
26
+ rspec (3.10.0)
27
+ rspec-core (~> 3.10.0)
28
+ rspec-expectations (~> 3.10.0)
29
+ rspec-mocks (~> 3.10.0)
30
+ rspec-core (3.10.1)
31
+ rspec-support (~> 3.10.0)
32
+ rspec-expectations (3.10.1)
33
+ diff-lcs (>= 1.2.0, < 2.0)
34
+ rspec-support (~> 3.10.0)
35
+ rspec-mocks (3.10.2)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.10.0)
38
+ rspec-support (3.10.2)
39
+ rubocop (1.14.0)
40
+ parallel (~> 1.10)
41
+ parser (>= 3.0.0.0)
42
+ rainbow (>= 2.2.2, < 4.0)
43
+ regexp_parser (>= 1.8, < 3.0)
44
+ rexml
45
+ rubocop-ast (>= 1.5.0, < 2.0)
46
+ ruby-progressbar (~> 1.7)
47
+ unicode-display_width (>= 1.4.0, < 3.0)
48
+ rubocop-ast (1.9.1)
49
+ parser (>= 3.0.1.1)
50
+ rubocop-performance (1.10.2)
51
+ rubocop (>= 0.90.0, < 2.0)
52
+ rubocop-ast (>= 0.4.0)
53
+ rubocop-rspec (2.2.0)
54
+ rubocop (~> 1.0)
55
+ rubocop-ast (>= 1.1.0)
56
+ ruby-progressbar (1.11.0)
57
+ simplecov (0.21.2)
58
+ docile (~> 1.1)
59
+ simplecov-html (~> 0.11)
60
+ simplecov_json_formatter (~> 0.1)
61
+ simplecov-html (0.12.3)
62
+ simplecov_json_formatter (0.1.2)
63
+ unicode-display_width (2.0.0)
64
+
65
+ PLATFORMS
66
+ ruby
67
+
68
+ DEPENDENCIES
69
+ japin!
70
+ lefthook (~> 0.7.2)
71
+ pry (~> 0.14.0)
72
+ rspec (~> 3.0)
73
+ rubocop (~> 1.14.0)
74
+ rubocop-performance (~> 1.10.2)
75
+ rubocop-rspec (~> 2.2.0)
76
+ simplecov (~> 0.21.2)
77
+
78
+ BUNDLED WITH
79
+ 2.1.4
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Artem Shevchenko
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
13
+ all 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
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # JsonApiNormalizer
2
+
3
+ Json API Normalizer gem is Ruby implementation of [json-api-normalizer](https://github.com/yury-dymov/json-api-normalizer) provides data normalization and formating for json api response like data.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'json_api_normalizer'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle install
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install json_api_normalizer
20
+
21
+ ## Usage
22
+
23
+ Pass hash to initializer and call `normalize` to normalize data.
24
+ ```ruby
25
+ data = { data: { id: '1', type: 'Manga', attributes: { name: "JoJo's Bizarre Adventure Part 6: Stone Ocean" } } }
26
+ JsonApiNormalizer.new(data).normalize
27
+ # output
28
+ # {"Manga"=>{"1"=>{"id"=>"1", "attributes"=>{"name"=>"JoJo's Bizarre Adventure Part 6: Stone Ocean"}, "type"=>"Manga"}}}
29
+ ```
30
+
31
+ You also can call `to_h` which is an alias of `normalize`.
32
+ ```ruby
33
+ data = { data: [
34
+ { id: '1', type: 'Manga', attributes: { name: "JoJo's Bizarre Adventure Part 5: Golden Wind" } },
35
+ { id: '2', type: 'Manga', attributes: { name: "JoJo's Bizarre Adventure Part 4: Diamond Is Unbreakable" } },
36
+ ] }
37
+ JsonApiNormalizer.new(data).to_h
38
+ # output
39
+ #{"Manga"=> {
40
+ # 1"=>{"id"=>"1", "attributes"=>{"name"=>"JoJo's Bizarre Adventure Part 5 : Golden Wind"}, "type"=>"Manga"},
41
+ # "2"=>{"id"=>"2", "attributes"=>{"name"=>"JoJo's Bizarre Adventure Part 4: Diamond Is Unbreakable"}, "type"=>"Manga"}
42
+ # } }
43
+ ```
44
+
45
+ Also normalizer supports includes normalization
46
+ ```ruby
47
+ data = {
48
+ data: [
49
+ { id: 1, type: 'Manga', attributes: { name: "JoJo's Bizarre Adventure Part 3: Stardust Crusaders" },
50
+ relationships: { author: { data: { id: 1, type: 'Author' } } } },
51
+ { id: 2, type: 'Manga', attributes: { name: "JoJo's Bizarre Adventure Part 2: Battle Tendency" } ,
52
+ relationships: { author: { data: { id: 1, type: 'Author' } } } }
53
+ ],
54
+ included: [{ id: 1, type: 'Author', attributes: { name: 'Hirohiko Araki' } }]
55
+ }
56
+ JsonApiNormalizer.new(data).to_h
57
+ # output =>
58
+ # {"Manga"=>
59
+ # {1=>
60
+ # {"id"=>1,
61
+ # "attributes"=>{"name"=>"JoJo's Bizarre Adventure Part 3: Stardust Crusaders"},
62
+ # "type"=>"Manga",
63
+ # "relationships"=>{"author"=>{"data"=>{"id"=>1, "type"=>"Author"}}}},
64
+ # 2=>
65
+ # {"id"=>2,
66
+ # "attributes"=>{"name"=>"JoJo's Bizarre Adventure Part 2: Battle Tendency"},
67
+ # "type"=>"Manga",
68
+ # "relationships"=>{"author"=>{"data"=>{"id"=>1, "type"=>"Author"}}}}},
69
+ # "Author"=>{1=>{"id"=>1, "attributes"=>{"name"=>"Hirohiko Araki"}, "type"=>"Author"}}}
70
+ ```
71
+
72
+ And another feature of normalizer is keys and type case transformation. To see all allowed cases see [lucky_case](https://github.com/magynhard/lucky_case) gem
73
+ ```ruby
74
+ data = { data: { id: '1', type: 'Manga', attributes: { name: "JoJo's Bizarre Adventure Part 1: Phantom Blood" } } }
75
+ JsonApiNormalizer.new(data, keys_case: :pascal_case, types_case: :upper_snake_case).normalize
76
+ # output
77
+ # {"MANGA"=>{"1"=>{"Id"=>"1", "Attributes"=>{"Name"=>"JoJo's Bizarre Adventure Part 1: Phantom Blood"}, "Type"=>"MANGA"}}}
78
+ ```
79
+
80
+ Endpoint option is not supported now :(
81
+
82
+ ## Development
83
+
84
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
85
+
86
+ ## Contributing
87
+
88
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Ar2emis/json_api_normalizer.
89
+
90
+
91
+ ## License
92
+
93
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/benchmark.rb ADDED
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'benchmark'
4
+ require_relative 'lib/json_api_normalizer'
5
+
6
+ json = {
7
+ data: [
8
+ {
9
+ attributes: {
10
+ yday: 228,
11
+ text: 'Какие качества Вы больше всего цените в женщинах?',
12
+ slug: 'tbd'
13
+ },
14
+ id: 29,
15
+ relationships: {
16
+ 'post-blocks': {
17
+ data: [
18
+ {
19
+ type: 'post-block',
20
+ id: 4601
21
+ },
22
+ {
23
+ type: 'post-block',
24
+ id: 2454
25
+ }
26
+ ]
27
+ }
28
+ },
29
+ type: 'question'
30
+ }
31
+ ],
32
+ included: [
33
+ {
34
+ attributes: {},
35
+ id: 4601,
36
+ relationships: {
37
+ user: {
38
+ data: {
39
+ type: 'user',
40
+ id: 1
41
+ }
42
+ },
43
+ posts: {
44
+ data: [
45
+ {
46
+ type: 'post',
47
+ id: 4969
48
+ },
49
+ {
50
+ type: 'post',
51
+ id: 1606
52
+ }
53
+ ]
54
+ }
55
+ },
56
+ type: 'post-block'
57
+ },
58
+ {
59
+ attributes: {},
60
+ id: 2454,
61
+ relationships: {
62
+ user: {
63
+ data: {
64
+ type: 'user',
65
+ id: 1
66
+ }
67
+ },
68
+ posts: {
69
+ data: [
70
+ {
71
+ type: 'post',
72
+ id: 4969
73
+ },
74
+ {
75
+ type: 'post',
76
+ id: 1606
77
+ }
78
+ ]
79
+ }
80
+ },
81
+ links: {
82
+ post_blocks: 'http://link.com'
83
+ },
84
+ type: 'post-block'
85
+ },
86
+ {
87
+ type: 'user',
88
+ attributes: {
89
+ slug: 'superyuri'
90
+ },
91
+ id: 1
92
+ },
93
+ {
94
+ type: 'post',
95
+ id: 1606,
96
+ attributes: {
97
+ text: 'hello1'
98
+ }
99
+ },
100
+ {
101
+ type: 'post',
102
+ id: 4969,
103
+ attributes: {
104
+ text: 'hello2'
105
+ },
106
+ meta: {
107
+ expires_at: 1_513_868_982
108
+ }
109
+ }
110
+ ]
111
+ }
112
+
113
+ time = Benchmark.measure do
114
+ 1_000_000.times { JsonApiNormalizer.new(json, keys_case: :camel_case, types_case: :camel_case) }
115
+ end
116
+
117
+ puts time
data/bin/console ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'json_api_normalizer'
6
+
7
+ require 'pry'
8
+ Pry.start
data/bin/setup ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
data/japin.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/japin/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'japin'
7
+ spec.version = Japin::VERSION
8
+ spec.authors = ['Artem Shevchenko']
9
+ spec.email = ['artemsheva0510@gmail.com']
10
+
11
+ spec.summary = 'Ruby implementation of NodeJS json-api-normalizer'
12
+ spec.homepage = 'https://github.com/Ar2emis/japin'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.7.2')
15
+
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = spec.homepage
18
+
19
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_development_dependency 'lefthook', '~> 0.7.2'
26
+ spec.add_development_dependency 'pry', '~> 0.14.0'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
+ spec.add_development_dependency 'rubocop', '~> 1.14.0'
29
+ spec.add_development_dependency 'rubocop-performance', '~> 1.10.2'
30
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.2.0'
31
+ spec.add_development_dependency 'simplecov', '~> 0.21.2'
32
+
33
+ spec.add_dependency 'lucky_case', '~> 1.1.0'
34
+ end
data/lefthook.yml ADDED
@@ -0,0 +1,6 @@
1
+ pre-commit:
2
+ parallel: true
3
+ commands:
4
+ rubocop:
5
+ glob: "*.rb"
6
+ run: bundle exec rubocop
data/lib/japin.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucky_case'
4
+ require_relative 'japin/version'
5
+ require_relative'japin/normalizer'
6
+
7
+ module Japin
8
+ end
@@ -0,0 +1,78 @@
1
+ module Japin
2
+ class Normalizer
3
+ attr_reader :input, :keys_case, :types_case
4
+
5
+ def initialize(input, keys_case: nil, types_case: nil)
6
+ @input = deep_transform_keys(input, &:to_s)
7
+ @keys_case = keys_case
8
+ @types_case = types_case
9
+ end
10
+
11
+ def normalize
12
+ return @output if @output
13
+
14
+ @output = {}
15
+ input.slice('data', 'included').each_value { |entities| extract_entities(entities) }
16
+ @output
17
+ end
18
+
19
+ alias to_h normalize
20
+
21
+ private
22
+
23
+ def extract_entities(json)
24
+ json.is_a?(Array) ? json.each { |record| extract_entity(record) } : extract_entity(json)
25
+ end
26
+
27
+ def extract_entity(record)
28
+ type = transform_type_case(record['type'])
29
+ @output[type] ||= {}
30
+ data = record.slice('id', 'attributes', 'links', 'meta').merge('type' => type)
31
+
32
+ data['relationships'] = extract_relationships(record['relationships']) if record.key?('relationships')
33
+
34
+ @output[type][record['id']] ||= process_entity_data(data)
35
+ end
36
+
37
+ def extract_relationships(relationships)
38
+ relationships.transform_values do |relationship|
39
+ data = case relationship['data']
40
+ when Array then relationship['data'].map { |record| process_relationship_data(record) }
41
+ when Hash then process_relationship_data(relationship['data'])
42
+ end
43
+ relationship.slice('links', 'meta').merge('data' => data)
44
+ end
45
+ end
46
+
47
+ def process_entity_data(data)
48
+ @keys_case ? deep_transform_keys(data) { |key| transform_key_case(key) } : data
49
+ end
50
+
51
+ def process_relationship_data(data)
52
+ data.slice('id').merge('type' => transform_type_case(data['type']))
53
+ end
54
+
55
+ def transform_type_case(key)
56
+ @types_case ? transform_case(key, @types_case) : key
57
+ end
58
+
59
+ def transform_key_case(key)
60
+ transform_case(key, @keys_case)
61
+ end
62
+
63
+ def transform_case(string, to_case)
64
+ LuckyCase.convert_case(string, to_case)
65
+ end
66
+
67
+ def deep_transform_keys(object, &block)
68
+ case object
69
+ when Hash
70
+ object.each_with_object({}) do |(key, value), result|
71
+ result[yield(key)] = deep_transform_keys(value, &block)
72
+ end
73
+ when Array then object.map { |element| deep_transform_keys(element, &block) }
74
+ else object
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Japin
4
+ VERSION = '0.1.0'
5
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: japin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Artem Shevchenko
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lefthook
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.14.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.14.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.14.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.14.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-performance
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.10.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.10.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 2.2.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.2.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.21.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.21.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: lucky_case
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.1.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.1.0
125
+ description:
126
+ email:
127
+ - artemsheva0510@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".rubocop.yml"
135
+ - ".ruby-gemset"
136
+ - ".ruby-version"
137
+ - Gemfile
138
+ - Gemfile.lock
139
+ - LICENSE.txt
140
+ - README.md
141
+ - benchmark.rb
142
+ - bin/console
143
+ - bin/setup
144
+ - japin.gemspec
145
+ - lefthook.yml
146
+ - lib/japin.rb
147
+ - lib/japin/normalizer.rb
148
+ - lib/japin/version.rb
149
+ homepage: https://github.com/Ar2emis/japin
150
+ licenses:
151
+ - MIT
152
+ metadata:
153
+ homepage_uri: https://github.com/Ar2emis/japin
154
+ source_code_uri: https://github.com/Ar2emis/japin
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: 2.7.2
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubygems_version: 3.1.4
171
+ signing_key:
172
+ specification_version: 4
173
+ summary: Ruby implementation of NodeJS json-api-normalizer
174
+ test_files: []