pair-kit-json-schema-dsl 0.0.1
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/CHANGELOG.md +4 -0
- data/Gemfile +7 -0
- data/LICENSE +20 -0
- data/README.md +43 -0
- data/Rakefile +21 -0
- data/lib/pair_kit/json_schema/dsl/nodes/array_dsl.rb +50 -0
- data/lib/pair_kit/json_schema/dsl/nodes/array_item_dsl.rb +32 -0
- data/lib/pair_kit/json_schema/dsl/nodes/boolean_dsl.rb +12 -0
- data/lib/pair_kit/json_schema/dsl/nodes/number_dsl.rb +13 -0
- data/lib/pair_kit/json_schema/dsl/nodes/object_dsl.rb +51 -0
- data/lib/pair_kit/json_schema/dsl/nodes/property_dsl.rb +25 -0
- data/lib/pair_kit/json_schema/dsl/nodes/schema_dsl.rb +15 -0
- data/lib/pair_kit/json_schema/dsl/nodes/string_dsl.rb +36 -0
- data/lib/pair_kit/json_schema/dsl/partials/common_partial_dsl.rb +17 -0
- data/lib/pair_kit/json_schema/dsl/partials/const_partial_dsl.rb +16 -0
- data/lib/pair_kit/json_schema/dsl/partials/core_partial_dsl.rb +48 -0
- data/lib/pair_kit/json_schema/dsl/partials/enum_partial_dsl.rb +18 -0
- data/lib/pair_kit/json_schema/dsl/partials/meta_data_partial_dsl.rb +48 -0
- data/lib/pair_kit/json_schema/dsl/partials/null_partial_dsl.rb +17 -0
- data/lib/pair_kit/json_schema/dsl/partials/numeric_partial_dsl.rb +40 -0
- data/lib/pair_kit/json_schema/dsl/partials/structural_partial_dsl.rb +66 -0
- data/lib/pair_kit/json_schema/dsl/partials/type_partial_dsl.rb +73 -0
- data/lib/pair_kit/json_schema/dsl/scaffolds/array_scaffold.rb +39 -0
- data/lib/pair_kit/json_schema/dsl/scaffolds/hash_scaffold.rb +28 -0
- data/lib/pair_kit/json_schema/dsl/scaffolds/scaffold.rb +16 -0
- data/lib/pair_kit/json_schema/dsl/scaffolds/scalar_scaffold.rb +26 -0
- data/lib/pair_kit/json_schema/dsl/version.rb +9 -0
- data/lib/pair_kit/json_schema/dsl.rb +51 -0
- metadata +274 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dfd42349dd23c72480ba3c5b4f8a2f0dafa44da7fd727631d4436adf7f53ca94
|
4
|
+
data.tar.gz: 6fe039181406355731f7ce88f1253ceb27b19eb98e5e3c68b21156e0cb68bdd4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 82bf6dd7b02c0d69a4640fb607d041e0bd6dd0d0a1f64b4c0f30d46caeab6d9cd6fb08a7960aec30cb7e621332b9008c4816440dcf151338a6059a410f6340a7
|
7
|
+
data.tar.gz: a0e9242e02fa8433d1086b6f9d86f225d9dd51a8a6ba28aeea26697c4bb2734bd251c7299b5e3e1ca28b8688bfa67cd44f13cb2e17a2c482915078338f598257
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2024 PairFinance team, Dmitry Sharkov
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
17
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
18
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
19
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
20
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# PairKit::JsonSchema::Dsl
|
2
|
+
|
3
|
+
Ruby DSL to build Json Schemas
|
4
|
+
|
5
|
+
---
|
6
|
+
**NOTE**
|
7
|
+
|
8
|
+
This gem is under heavy developmetn. Don't use it now, wait until v.0.1.0
|
9
|
+
|
10
|
+
---
|
11
|
+
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
In your ```Gemfile```:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
gem 'pair_kit_json_schema_dsl'
|
19
|
+
```
|
20
|
+
|
21
|
+
In your code:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
require 'pari_kit/json_schema/dsl'
|
25
|
+
```
|
26
|
+
|
27
|
+
### Example
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
dsl = PairKit::JsonSchema::Dsl.new
|
31
|
+
|
32
|
+
array_of_strings = dsl.build { arr { str } }
|
33
|
+
|
34
|
+
simple_object = dsl.build do
|
35
|
+
object do
|
36
|
+
prop(:first_name).required.str
|
37
|
+
prop(:last_name).required.str
|
38
|
+
prop(:middle_name).str.null
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
```
|
43
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
Bundler::GemHelper.install_tasks
|
6
|
+
rescue LoadError
|
7
|
+
puts 'although not required, bundler is recommended for running the tests'
|
8
|
+
end
|
9
|
+
|
10
|
+
task default: :spec
|
11
|
+
|
12
|
+
require 'rspec/core/rake_task'
|
13
|
+
|
14
|
+
RSpec::Core::RakeTask.new(:spec)
|
15
|
+
|
16
|
+
require 'rubocop/rake_task'
|
17
|
+
|
18
|
+
RuboCop::RakeTask.new do |task|
|
19
|
+
task.requires << 'rubocop-performance'
|
20
|
+
task.requires << 'rubocop-rspec'
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
module ArrayDsl
|
7
|
+
include CommonPartialDsl
|
8
|
+
include(TypePartialDsl.apply_to { @subject['items', {}] })
|
9
|
+
|
10
|
+
def items(&block)
|
11
|
+
@dsl.call(@subject, builder: :array_item, name: 'items', min_max: 'Items', &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def prefix_item(&block)
|
15
|
+
subject['prefixItems', []] << {}
|
16
|
+
@dsl.call(@subject['prefixItems'].last, builder: :schema, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def contains(&block)
|
20
|
+
@dsl.call(@subject, builder: :array_item, name: 'contains', min_max: 'Contains', &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def min_items(val)
|
24
|
+
@subject['minItems'] = val
|
25
|
+
end
|
26
|
+
|
27
|
+
def max_items(val)
|
28
|
+
@subject['maxItems'] = val
|
29
|
+
end
|
30
|
+
|
31
|
+
def max_contains(val)
|
32
|
+
@subject['maxContains'] = val
|
33
|
+
end
|
34
|
+
|
35
|
+
def min_contains(val)
|
36
|
+
@subject['minContains'] = val
|
37
|
+
end
|
38
|
+
|
39
|
+
def unique_items
|
40
|
+
@subject['uniqueItems'] = true
|
41
|
+
end
|
42
|
+
|
43
|
+
def duplicated_items
|
44
|
+
@subject['uniqueItems'] = false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
##
|
7
|
+
# This makes is possible to write something like
|
8
|
+
##
|
9
|
+
# array.items.string
|
10
|
+
# array.items.min(10).max(20).string
|
11
|
+
# array.items { string }.min_items(10).max_items(20)
|
12
|
+
# array.items { string; min(10); max(20) }.unique
|
13
|
+
##
|
14
|
+
# array.contains.string
|
15
|
+
# array.contains.min(10).max(20).string
|
16
|
+
# array.contains { string }.min_contains(10).max_contains(20)
|
17
|
+
# array.contains { string; min(10); max(20) }.unique
|
18
|
+
#
|
19
|
+
module ArrayItemDsl
|
20
|
+
include(TypePartialDsl.apply_to { @subject[@options[:name]] })
|
21
|
+
|
22
|
+
def max(val)
|
23
|
+
@subject["max#{@options[:min_max]}"] = val
|
24
|
+
end
|
25
|
+
|
26
|
+
def min(val)
|
27
|
+
@subject["max#{@options[:min_max]}"] = val
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
# See https://www.learnjsonschema.com/2020-12/applicator/
|
7
|
+
module ObjectDsl
|
8
|
+
include CommonPartialDsl
|
9
|
+
|
10
|
+
def prop(name, &block)
|
11
|
+
@subject['properties', {}][name] = {}
|
12
|
+
@dsl.call(@subject, builder: :property, name: name, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def pattern_props
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def additional_properties
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def prop_names
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def dependent_schemas
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
def min_props(val)
|
32
|
+
@subject['minLength'] = val
|
33
|
+
end
|
34
|
+
|
35
|
+
def dependency(name, *dependent)
|
36
|
+
@subject['dependentRequired', {}][name, []] += dependent
|
37
|
+
end
|
38
|
+
|
39
|
+
def max_props(val)
|
40
|
+
@subject['maxLength'] = val
|
41
|
+
end
|
42
|
+
|
43
|
+
def required(*props)
|
44
|
+
@subject['required', []] += props
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
# See https://json-schema.org/understanding-json-schema/reference/object
|
7
|
+
module PropertyDsl
|
8
|
+
include TypePartialDsl.apply_to { @subject['properties'][@options[:name]] }
|
9
|
+
|
10
|
+
def required
|
11
|
+
@subject['required', []] << Miniflector.camel_case(@options[:name])
|
12
|
+
end
|
13
|
+
|
14
|
+
def optional
|
15
|
+
@subject['required', []].delete(Miniflector.camel_case(@options[:name]))
|
16
|
+
end
|
17
|
+
|
18
|
+
def dependent_on(*dependencies)
|
19
|
+
@subject['dependentRequired', {}][@options[:name], []] += dependencies
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
# See https://json-schema.org/understanding-json-schema/reference/object
|
7
|
+
module SchemaDsl
|
8
|
+
include CommonPartialDsl
|
9
|
+
include(TypePartialDsl.apply_to { @subject })
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
# See https://www.learnjsonschema.com/2020-12/validation/
|
7
|
+
module StringDsl
|
8
|
+
include CommonPartialDsl
|
9
|
+
|
10
|
+
def min_len(val)
|
11
|
+
@subject['minLength'] = val
|
12
|
+
end
|
13
|
+
|
14
|
+
alias len_gteq min_len
|
15
|
+
|
16
|
+
def pattern(re)
|
17
|
+
@subject['pattern'] = re
|
18
|
+
end
|
19
|
+
|
20
|
+
alias re pattern
|
21
|
+
|
22
|
+
def max_len(val)
|
23
|
+
@subject['maxLength'] = val
|
24
|
+
end
|
25
|
+
|
26
|
+
alias len_lteq max_len
|
27
|
+
|
28
|
+
def len_eq(val)
|
29
|
+
min_len(val)
|
30
|
+
max_len(val)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
module CommonPartialDsl
|
7
|
+
include CorePartialDsl
|
8
|
+
include MetaDataPartialDsl
|
9
|
+
include ConstPartialDsl
|
10
|
+
include EnumPartialDsl
|
11
|
+
include StructuralPartialDsl
|
12
|
+
include NullPartialDsl
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
module CorePartialDsl
|
7
|
+
def schema(schema)
|
8
|
+
@subject['$schema'] = schema
|
9
|
+
end
|
10
|
+
|
11
|
+
def id(id)
|
12
|
+
@subject['$id'] = id
|
13
|
+
end
|
14
|
+
|
15
|
+
def ref(ref)
|
16
|
+
@subject['$ref'] = ref
|
17
|
+
end
|
18
|
+
|
19
|
+
def comment(comment)
|
20
|
+
@subject['$comment'] = comment
|
21
|
+
end
|
22
|
+
|
23
|
+
def define(name, &block)
|
24
|
+
@dsl.(@subject['$defs', {}][name, {}], &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
alias dfn define
|
28
|
+
|
29
|
+
def anchor(anchor)
|
30
|
+
@subject['$anchor'] = anchor
|
31
|
+
end
|
32
|
+
|
33
|
+
def dynamic_anchor(anchor)
|
34
|
+
@subject['$dynamicAnchor'] = anchor
|
35
|
+
end
|
36
|
+
|
37
|
+
def dynamic_ref(ref)
|
38
|
+
@subject['$dynamicRef'] = ref
|
39
|
+
end
|
40
|
+
|
41
|
+
def vocabulary(vocab)
|
42
|
+
@subject['$vocabulary', {}][vocab] = true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
# See https://www.learnjsonschema.com/2020-12/validation/enum/
|
7
|
+
module EnumPartialDsl
|
8
|
+
def enum(*args)
|
9
|
+
@subject['enum', []] += args
|
10
|
+
end
|
11
|
+
|
12
|
+
alias in enum
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
# See https://www.learnjsonschema.com/2020-12/meta-data/
|
7
|
+
module MetaDataPartialDsl
|
8
|
+
def title(title)
|
9
|
+
@subject['title'] = title
|
10
|
+
end
|
11
|
+
|
12
|
+
def description(description = nil, &block)
|
13
|
+
@subject['description'] = description || block&.call
|
14
|
+
end
|
15
|
+
|
16
|
+
def default(val)
|
17
|
+
@subject['default'] = val
|
18
|
+
end
|
19
|
+
|
20
|
+
def deprecated
|
21
|
+
@subject['deprecated'] = true
|
22
|
+
end
|
23
|
+
|
24
|
+
def example(example = nil, &block)
|
25
|
+
@subject['examples', []] << example || block&.call
|
26
|
+
end
|
27
|
+
|
28
|
+
def read_only
|
29
|
+
@subject['readOnly'] = true
|
30
|
+
end
|
31
|
+
|
32
|
+
def writable
|
33
|
+
@subject['readOnly'] = false
|
34
|
+
end
|
35
|
+
|
36
|
+
def write_only
|
37
|
+
@subject['writeOnly'] = true
|
38
|
+
end
|
39
|
+
|
40
|
+
def readable
|
41
|
+
@subject['writeOnly'] = false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
# See https://www.learnjsonschema.com/2020-12/validation/const/
|
7
|
+
|
8
|
+
module NullPartialDsl
|
9
|
+
def null
|
10
|
+
@subject['type'] << 'null'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
module NumericPartialDsl
|
7
|
+
def gt(val)
|
8
|
+
@subject['exclusiveMinimum'] = val
|
9
|
+
end
|
10
|
+
|
11
|
+
alias exclusive_minimum gt
|
12
|
+
|
13
|
+
def gteq(val)
|
14
|
+
@subject['minimum'] = val
|
15
|
+
end
|
16
|
+
|
17
|
+
alias minimum gteq
|
18
|
+
|
19
|
+
def lt(val)
|
20
|
+
@subject['exclusiveMaximum'] = val
|
21
|
+
end
|
22
|
+
|
23
|
+
alias exclusive_maximum lt
|
24
|
+
|
25
|
+
def lteq(val)
|
26
|
+
@subject['maximum'] = val
|
27
|
+
end
|
28
|
+
|
29
|
+
alias maximum lteq
|
30
|
+
|
31
|
+
def mult_of(val)
|
32
|
+
@subject['multipleOf'] = val
|
33
|
+
end
|
34
|
+
|
35
|
+
alias multiple_of mult_of
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
module StructuralPartialDsl
|
7
|
+
def any_of(&block)
|
8
|
+
append_applicator('anyOf', &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
alias may_be any_of
|
12
|
+
alias or any_of
|
13
|
+
|
14
|
+
def one_of(&block)
|
15
|
+
append_applicator('anyOf', &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias may_be_once one_of
|
19
|
+
alias xor one_of
|
20
|
+
|
21
|
+
def all_of(&block)
|
22
|
+
append_applicator('allOf', &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
alias must_be all_of
|
26
|
+
alias and all_of
|
27
|
+
|
28
|
+
def _then(&block)
|
29
|
+
use_applicator('then', &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
alias then_check _then
|
33
|
+
|
34
|
+
def _if(&block)
|
35
|
+
use_applicator('if', &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
alias if_fits _if
|
39
|
+
|
40
|
+
def _else(&block)
|
41
|
+
use_applicator('else', &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
alias else_check _else
|
45
|
+
|
46
|
+
def _not(&block)
|
47
|
+
use_applicator('not', &block)
|
48
|
+
end
|
49
|
+
|
50
|
+
alias must_not_be _not
|
51
|
+
alias prohibit _not
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def append_applicator(name, &block)
|
56
|
+
@dsl.call(@subject[name, []] << {}, builder: @options[:builder], &block)
|
57
|
+
end
|
58
|
+
|
59
|
+
def use_applicator(name, &block)
|
60
|
+
@dsl.call(@subject[name, {}], builder: @options[:builder], &block)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
module TypePartialDsl
|
7
|
+
module Base
|
8
|
+
def str(&block)
|
9
|
+
type!('string', &block)
|
10
|
+
end
|
11
|
+
|
12
|
+
alias string str
|
13
|
+
|
14
|
+
def int(&block)
|
15
|
+
type!('integer', &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias integer int
|
19
|
+
|
20
|
+
def bool(&block)
|
21
|
+
type!('boolean', &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
alias boolean bool
|
25
|
+
|
26
|
+
def num(&block)
|
27
|
+
type!('number', &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
alias number num
|
31
|
+
alias float num
|
32
|
+
alias flt num
|
33
|
+
|
34
|
+
def obj(&block)
|
35
|
+
type!('object', &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
alias object obj
|
39
|
+
alias struct obj
|
40
|
+
|
41
|
+
def arr(&block)
|
42
|
+
type!('array', &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
alias array arr
|
46
|
+
|
47
|
+
def null
|
48
|
+
type!('null')
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def type!(type, &block)
|
54
|
+
_subject_['type'] << type
|
55
|
+
@dsl.call(_subject_, builder: type, &block) if block
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.apply_to(&subject_resolver)
|
60
|
+
Module.new do
|
61
|
+
include Base
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
define_method(:_subject_, &subject_resolver)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module PairKit
|
2
|
+
class JsonSchema
|
3
|
+
class Dsl
|
4
|
+
class ArrayScaffold < Scaffold
|
5
|
+
def initialize(val)
|
6
|
+
@array = val.is_a?(ArrayScaffold) ? val.array : val.map { |x| Scaffold.wrap(x) }
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def <<(item)
|
11
|
+
@array << Scaffold.wrap(item)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_schema
|
15
|
+
@array.map(&:to_schema)
|
16
|
+
end
|
17
|
+
|
18
|
+
def first
|
19
|
+
@array.first
|
20
|
+
end
|
21
|
+
|
22
|
+
def last
|
23
|
+
@array.last
|
24
|
+
end
|
25
|
+
|
26
|
+
def +(arr)
|
27
|
+
ArrayScaffold.new([]).tap do |scf|
|
28
|
+
scf.array = array + ArrayScaffold.new(arr).array
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
attr_accessor :array
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module PairKit
|
2
|
+
class JsonSchema
|
3
|
+
class Dsl
|
4
|
+
class HashScaffold < Scaffold
|
5
|
+
def initialize(val)
|
6
|
+
@hash = val
|
7
|
+
end
|
8
|
+
|
9
|
+
def [](name, default = nil)
|
10
|
+
name = Miniflector.camel_case(name)
|
11
|
+
return @hash[name] if @hash.key?(name)
|
12
|
+
|
13
|
+
@hash[name] = Scaffold.wrap(default)
|
14
|
+
end
|
15
|
+
|
16
|
+
def []=(name, val)
|
17
|
+
name = Miniflector.camel_case(name)
|
18
|
+
@hash[name] = Scaffold.wrap(val)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_schema
|
22
|
+
@hash.transform_values(&:to_schema)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module PairKit
|
2
|
+
class JsonSchema
|
3
|
+
class Dsl
|
4
|
+
class Scaffold
|
5
|
+
def self.wrap(val)
|
6
|
+
case val
|
7
|
+
when Scaffold then val
|
8
|
+
when Hash then HashScaffold.new(val)
|
9
|
+
when Array then ArrayScaffold.new(val)
|
10
|
+
else ScalarScaffold.new(val)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module PairKit
|
2
|
+
class JsonSchema
|
3
|
+
class Dsl
|
4
|
+
class ScalarScaffold < Scaffold
|
5
|
+
def initialize(val)
|
6
|
+
@value = val
|
7
|
+
end
|
8
|
+
|
9
|
+
def <<(val)
|
10
|
+
if @value
|
11
|
+
@value.is_a?(Array) ? @value << val : @value = [@value, val]
|
12
|
+
else
|
13
|
+
@value = val
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_schema
|
18
|
+
@value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PairKit
|
4
|
+
class JsonSchema
|
5
|
+
class Dsl
|
6
|
+
require 'pair_kit/dsl_factory'
|
7
|
+
require 'pair_kit/miniflector'
|
8
|
+
|
9
|
+
require_relative 'dsl/version'
|
10
|
+
|
11
|
+
require_relative 'dsl/scaffolds/scaffold'
|
12
|
+
require_relative 'dsl/scaffolds/hash_scaffold'
|
13
|
+
require_relative 'dsl/scaffolds/array_scaffold'
|
14
|
+
require_relative 'dsl/scaffolds/scalar_scaffold'
|
15
|
+
|
16
|
+
require_relative 'dsl/partials/const_partial_dsl'
|
17
|
+
require_relative 'dsl/partials/core_partial_dsl'
|
18
|
+
require_relative 'dsl/partials/enum_partial_dsl'
|
19
|
+
require_relative 'dsl/partials/meta_data_partial_dsl'
|
20
|
+
require_relative 'dsl/partials/null_partial_dsl'
|
21
|
+
require_relative 'dsl/partials/numeric_partial_dsl'
|
22
|
+
require_relative 'dsl/partials/structural_partial_dsl'
|
23
|
+
require_relative 'dsl/partials/type_partial_dsl'
|
24
|
+
require_relative 'dsl/partials/common_partial_dsl'
|
25
|
+
|
26
|
+
require_relative 'dsl/nodes/array_dsl'
|
27
|
+
require_relative 'dsl/nodes/array_item_dsl'
|
28
|
+
require_relative 'dsl/nodes/boolean_dsl'
|
29
|
+
require_relative 'dsl/nodes/number_dsl'
|
30
|
+
require_relative 'dsl/nodes/object_dsl'
|
31
|
+
require_relative 'dsl/nodes/property_dsl'
|
32
|
+
require_relative 'dsl/nodes/schema_dsl'
|
33
|
+
require_relative 'dsl/nodes/string_dsl'
|
34
|
+
|
35
|
+
BASE_DSL = DslFactory.new do
|
36
|
+
configure_builder :schema, SchemaDsl
|
37
|
+
configure_builder :array, ArrayDsl
|
38
|
+
configure_builder :object, ObjectDsl
|
39
|
+
configure_builder :number, NumberDsl
|
40
|
+
configure_builder :integer, NumberDsl
|
41
|
+
configure_builder :string, StringDsl
|
42
|
+
configure_builder :property, PropertyDsl
|
43
|
+
configure_builder :array_item, ArrayItemDsl
|
44
|
+
end
|
45
|
+
|
46
|
+
def build(&block)
|
47
|
+
BASE_DSL.build(Scaffold.wrap({}), &block).to_schema
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
metadata
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pair-kit-json-schema-dsl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dmitry Sharkov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-07-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pair-kit-dsl-factory
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.0.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.0.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: pair-kit-miniflector
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.0'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.0.1
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.0.1
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: pry-byebug
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '3.10'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 3.10.1
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.10'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 3.10.1
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: pry-alias
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.0'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.0.1
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.0'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 0.0.1
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: rubocop
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.64'
|
100
|
+
type: :development
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - "~>"
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '1.64'
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: rubocop-performance
|
109
|
+
requirement: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - "~>"
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '1.20'
|
114
|
+
type: :development
|
115
|
+
prerelease: false
|
116
|
+
version_requirements: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '1.20'
|
121
|
+
- !ruby/object:Gem::Dependency
|
122
|
+
name: rubocop-rspec
|
123
|
+
requirement: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - "~>"
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '3.0'
|
128
|
+
type: :development
|
129
|
+
prerelease: false
|
130
|
+
version_requirements: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - "~>"
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '3.0'
|
135
|
+
- !ruby/object:Gem::Dependency
|
136
|
+
name: rake
|
137
|
+
requirement: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - "~>"
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '13.0'
|
142
|
+
type: :development
|
143
|
+
prerelease: false
|
144
|
+
version_requirements: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - "~>"
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '13.0'
|
149
|
+
- !ruby/object:Gem::Dependency
|
150
|
+
name: rspec
|
151
|
+
requirement: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - "~>"
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '3.4'
|
156
|
+
type: :development
|
157
|
+
prerelease: false
|
158
|
+
version_requirements: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - "~>"
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '3.4'
|
163
|
+
- !ruby/object:Gem::Dependency
|
164
|
+
name: rspec-rails
|
165
|
+
requirement: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - "~>"
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '3.4'
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 3.4.2
|
173
|
+
type: :development
|
174
|
+
prerelease: false
|
175
|
+
version_requirements: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - "~>"
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '3.4'
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: 3.4.2
|
183
|
+
- !ruby/object:Gem::Dependency
|
184
|
+
name: simplecov
|
185
|
+
requirement: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - "~>"
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0.19'
|
190
|
+
type: :development
|
191
|
+
prerelease: false
|
192
|
+
version_requirements: !ruby/object:Gem::Requirement
|
193
|
+
requirements:
|
194
|
+
- - "~>"
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: '0.19'
|
197
|
+
- !ruby/object:Gem::Dependency
|
198
|
+
name: simplecov-cobertura
|
199
|
+
requirement: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - "~>"
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '2.1'
|
204
|
+
type: :development
|
205
|
+
prerelease: false
|
206
|
+
version_requirements: !ruby/object:Gem::Requirement
|
207
|
+
requirements:
|
208
|
+
- - "~>"
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
version: '2.1'
|
211
|
+
description: This gem helps to build JSON schemas
|
212
|
+
email:
|
213
|
+
- dmitry.sharkov@gmail.com
|
214
|
+
- dmitry.sharkov@pairfinance.com
|
215
|
+
executables: []
|
216
|
+
extensions: []
|
217
|
+
extra_rdoc_files:
|
218
|
+
- README.md
|
219
|
+
files:
|
220
|
+
- CHANGELOG.md
|
221
|
+
- Gemfile
|
222
|
+
- LICENSE
|
223
|
+
- README.md
|
224
|
+
- Rakefile
|
225
|
+
- lib/pair_kit/json_schema/dsl.rb
|
226
|
+
- lib/pair_kit/json_schema/dsl/nodes/array_dsl.rb
|
227
|
+
- lib/pair_kit/json_schema/dsl/nodes/array_item_dsl.rb
|
228
|
+
- lib/pair_kit/json_schema/dsl/nodes/boolean_dsl.rb
|
229
|
+
- lib/pair_kit/json_schema/dsl/nodes/number_dsl.rb
|
230
|
+
- lib/pair_kit/json_schema/dsl/nodes/object_dsl.rb
|
231
|
+
- lib/pair_kit/json_schema/dsl/nodes/property_dsl.rb
|
232
|
+
- lib/pair_kit/json_schema/dsl/nodes/schema_dsl.rb
|
233
|
+
- lib/pair_kit/json_schema/dsl/nodes/string_dsl.rb
|
234
|
+
- lib/pair_kit/json_schema/dsl/partials/common_partial_dsl.rb
|
235
|
+
- lib/pair_kit/json_schema/dsl/partials/const_partial_dsl.rb
|
236
|
+
- lib/pair_kit/json_schema/dsl/partials/core_partial_dsl.rb
|
237
|
+
- lib/pair_kit/json_schema/dsl/partials/enum_partial_dsl.rb
|
238
|
+
- lib/pair_kit/json_schema/dsl/partials/meta_data_partial_dsl.rb
|
239
|
+
- lib/pair_kit/json_schema/dsl/partials/null_partial_dsl.rb
|
240
|
+
- lib/pair_kit/json_schema/dsl/partials/numeric_partial_dsl.rb
|
241
|
+
- lib/pair_kit/json_schema/dsl/partials/structural_partial_dsl.rb
|
242
|
+
- lib/pair_kit/json_schema/dsl/partials/type_partial_dsl.rb
|
243
|
+
- lib/pair_kit/json_schema/dsl/scaffolds/array_scaffold.rb
|
244
|
+
- lib/pair_kit/json_schema/dsl/scaffolds/hash_scaffold.rb
|
245
|
+
- lib/pair_kit/json_schema/dsl/scaffolds/scaffold.rb
|
246
|
+
- lib/pair_kit/json_schema/dsl/scaffolds/scalar_scaffold.rb
|
247
|
+
- lib/pair_kit/json_schema/dsl/version.rb
|
248
|
+
homepage: https://github.com/pair-finance/pair_kit_json_schemas_dsl
|
249
|
+
licenses:
|
250
|
+
- MIT
|
251
|
+
metadata:
|
252
|
+
homepage_uri: https://github.com/pair-finance/pair_kit_json_schemas_dsl
|
253
|
+
source_code_uri: https://github.com/pair-finance/pair_kit_json_schemas_dsl
|
254
|
+
changelog_uri: https://github.com/pair-finance/pair_kit_json_schemas_dsl/blob/main/CHANGELOG.md
|
255
|
+
post_install_message:
|
256
|
+
rdoc_options: []
|
257
|
+
require_paths:
|
258
|
+
- lib
|
259
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
260
|
+
requirements:
|
261
|
+
- - ">="
|
262
|
+
- !ruby/object:Gem::Version
|
263
|
+
version: 2.5.0
|
264
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
265
|
+
requirements:
|
266
|
+
- - ">="
|
267
|
+
- !ruby/object:Gem::Version
|
268
|
+
version: '0'
|
269
|
+
requirements: []
|
270
|
+
rubygems_version: 3.1.6
|
271
|
+
signing_key:
|
272
|
+
specification_version: 4
|
273
|
+
summary: Ruby DSL to build Json Schemas
|
274
|
+
test_files: []
|