jimmy 0.5.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.circleci/config.yml +35 -0
- data/.gitignore +4 -3
- data/.rspec +3 -0
- data/.rubocop.yml +61 -0
- data/.ruby-version +1 -1
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +13 -0
- data/LICENSE +1 -1
- data/README.md +22 -134
- data/Rakefile +91 -1
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/jimmy.gemspec +25 -21
- data/lib/jimmy.rb +23 -15
- data/lib/jimmy/declaration.rb +150 -0
- data/lib/jimmy/declaration/assertion.rb +81 -0
- data/lib/jimmy/declaration/casting.rb +34 -0
- data/lib/jimmy/declaration/composites.rb +41 -0
- data/lib/jimmy/declaration/number.rb +27 -0
- data/lib/jimmy/declaration/object.rb +11 -0
- data/lib/jimmy/declaration/string.rb +100 -0
- data/lib/jimmy/declaration/types.rb +57 -0
- data/lib/jimmy/error.rb +9 -0
- data/lib/jimmy/file_map.rb +166 -0
- data/lib/jimmy/index.rb +78 -0
- data/lib/jimmy/json/array.rb +93 -0
- data/lib/jimmy/json/collection.rb +90 -0
- data/lib/jimmy/json/hash.rb +118 -0
- data/lib/jimmy/json/pointer.rb +119 -0
- data/lib/jimmy/json/uri.rb +144 -0
- data/lib/jimmy/loaders/base.rb +30 -0
- data/lib/jimmy/loaders/json.rb +15 -0
- data/lib/jimmy/loaders/ruby.rb +21 -0
- data/lib/jimmy/macros.rb +37 -0
- data/lib/jimmy/schema.rb +106 -86
- data/lib/jimmy/schema/array.rb +95 -0
- data/lib/jimmy/schema/casting.rb +17 -0
- data/lib/jimmy/schema/json.rb +40 -0
- data/lib/jimmy/schema/number.rb +47 -0
- data/lib/jimmy/schema/object.rb +108 -0
- data/lib/jimmy/schema/operators.rb +96 -0
- data/lib/jimmy/schema/string.rb +44 -0
- data/lib/jimmy/schema_with_uri.rb +53 -0
- data/lib/jimmy/schemer_factory.rb +65 -0
- data/lib/jimmy/version.rb +3 -1
- data/schema07.json +172 -0
- metadata +50 -101
- data/circle.yml +0 -11
- data/lib/jimmy/combination.rb +0 -34
- data/lib/jimmy/definitions.rb +0 -38
- data/lib/jimmy/domain.rb +0 -111
- data/lib/jimmy/link.rb +0 -93
- data/lib/jimmy/reference.rb +0 -39
- data/lib/jimmy/schema_creation.rb +0 -121
- data/lib/jimmy/schema_type.rb +0 -100
- data/lib/jimmy/schema_types.rb +0 -42
- data/lib/jimmy/schema_types/array.rb +0 -30
- data/lib/jimmy/schema_types/boolean.rb +0 -6
- data/lib/jimmy/schema_types/integer.rb +0 -8
- data/lib/jimmy/schema_types/null.rb +0 -6
- data/lib/jimmy/schema_types/number.rb +0 -34
- data/lib/jimmy/schema_types/object.rb +0 -45
- data/lib/jimmy/schema_types/string.rb +0 -40
- data/lib/jimmy/symbol_array.rb +0 -17
- data/lib/jimmy/transform_keys.rb +0 -39
- data/lib/jimmy/type_reference.rb +0 -10
- data/lib/jimmy/validation_error.rb +0 -20
metadata
CHANGED
@@ -1,126 +1,76 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jimmy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
name: json-schema
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2.5'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '2.5'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.9'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.9'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '10.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '10.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '3.2'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3.2'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: diff_matcher
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '2.7'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '2.7'
|
83
|
-
description: Jimmy makes it a snap to compose detailed JSON schema documents.
|
11
|
+
date: 2020-06-01 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Jimmy the Gem
|
84
14
|
email:
|
85
|
-
- neil
|
15
|
+
- neil@helium.net.au
|
86
16
|
executables: []
|
87
17
|
extensions: []
|
88
18
|
extra_rdoc_files: []
|
89
19
|
files:
|
20
|
+
- ".circleci/config.yml"
|
90
21
|
- ".gitignore"
|
22
|
+
- ".rspec"
|
23
|
+
- ".rubocop.yml"
|
91
24
|
- ".ruby-version"
|
25
|
+
- ".travis.yml"
|
26
|
+
- CODE_OF_CONDUCT.md
|
92
27
|
- Gemfile
|
93
28
|
- LICENSE
|
94
29
|
- README.md
|
95
30
|
- Rakefile
|
96
|
-
-
|
31
|
+
- bin/console
|
32
|
+
- bin/setup
|
97
33
|
- jimmy.gemspec
|
98
34
|
- lib/jimmy.rb
|
99
|
-
- lib/jimmy/
|
100
|
-
- lib/jimmy/
|
101
|
-
- lib/jimmy/
|
102
|
-
- lib/jimmy/
|
103
|
-
- lib/jimmy/
|
35
|
+
- lib/jimmy/declaration.rb
|
36
|
+
- lib/jimmy/declaration/assertion.rb
|
37
|
+
- lib/jimmy/declaration/casting.rb
|
38
|
+
- lib/jimmy/declaration/composites.rb
|
39
|
+
- lib/jimmy/declaration/number.rb
|
40
|
+
- lib/jimmy/declaration/object.rb
|
41
|
+
- lib/jimmy/declaration/string.rb
|
42
|
+
- lib/jimmy/declaration/types.rb
|
43
|
+
- lib/jimmy/error.rb
|
44
|
+
- lib/jimmy/file_map.rb
|
45
|
+
- lib/jimmy/index.rb
|
46
|
+
- lib/jimmy/json/array.rb
|
47
|
+
- lib/jimmy/json/collection.rb
|
48
|
+
- lib/jimmy/json/hash.rb
|
49
|
+
- lib/jimmy/json/pointer.rb
|
50
|
+
- lib/jimmy/json/uri.rb
|
51
|
+
- lib/jimmy/loaders/base.rb
|
52
|
+
- lib/jimmy/loaders/json.rb
|
53
|
+
- lib/jimmy/loaders/ruby.rb
|
54
|
+
- lib/jimmy/macros.rb
|
104
55
|
- lib/jimmy/schema.rb
|
105
|
-
- lib/jimmy/
|
106
|
-
- lib/jimmy/
|
107
|
-
- lib/jimmy/
|
108
|
-
- lib/jimmy/
|
109
|
-
- lib/jimmy/
|
110
|
-
- lib/jimmy/
|
111
|
-
- lib/jimmy/
|
112
|
-
- lib/jimmy/
|
113
|
-
- lib/jimmy/
|
114
|
-
- lib/jimmy/schema_types/string.rb
|
115
|
-
- lib/jimmy/symbol_array.rb
|
116
|
-
- lib/jimmy/transform_keys.rb
|
117
|
-
- lib/jimmy/type_reference.rb
|
118
|
-
- lib/jimmy/validation_error.rb
|
56
|
+
- lib/jimmy/schema/array.rb
|
57
|
+
- lib/jimmy/schema/casting.rb
|
58
|
+
- lib/jimmy/schema/json.rb
|
59
|
+
- lib/jimmy/schema/number.rb
|
60
|
+
- lib/jimmy/schema/object.rb
|
61
|
+
- lib/jimmy/schema/operators.rb
|
62
|
+
- lib/jimmy/schema/string.rb
|
63
|
+
- lib/jimmy/schema_with_uri.rb
|
64
|
+
- lib/jimmy/schemer_factory.rb
|
119
65
|
- lib/jimmy/version.rb
|
66
|
+
- schema07.json
|
120
67
|
homepage: https://github.com/hx/jimmy
|
121
68
|
licenses:
|
122
69
|
- Apache License, Version 2.0
|
123
|
-
metadata:
|
70
|
+
metadata:
|
71
|
+
homepage_uri: https://github.com/hx/jimmy
|
72
|
+
source_code_uri: https://github.com/hx/jimmy
|
73
|
+
changelog_uri: https://github.com/hx/jimmy
|
124
74
|
post_install_message:
|
125
75
|
rdoc_options: []
|
126
76
|
require_paths:
|
@@ -129,16 +79,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
129
79
|
requirements:
|
130
80
|
- - ">="
|
131
81
|
- !ruby/object:Gem::Version
|
132
|
-
version:
|
82
|
+
version: 2.3.0
|
133
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
84
|
requirements:
|
135
85
|
- - ">="
|
136
86
|
- !ruby/object:Gem::Version
|
137
87
|
version: '0'
|
138
88
|
requirements: []
|
139
|
-
|
140
|
-
rubygems_version: 2.4.3
|
89
|
+
rubygems_version: 3.0.6
|
141
90
|
signing_key:
|
142
91
|
specification_version: 4
|
143
|
-
summary: Jimmy the
|
92
|
+
summary: Jimmy the Gem
|
144
93
|
test_files: []
|
data/circle.yml
DELETED
data/lib/jimmy/combination.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require_relative 'schema_types'
|
2
|
-
|
3
|
-
module Jimmy
|
4
|
-
class Combination < Array
|
5
|
-
include SchemaCreation::Referencing
|
6
|
-
|
7
|
-
attr_reader :condition, :schema
|
8
|
-
|
9
|
-
# @param [Symbol] condition One of :one, :all, or :any
|
10
|
-
def initialize(condition, schema)
|
11
|
-
@condition = condition
|
12
|
-
@schema = schema
|
13
|
-
end
|
14
|
-
|
15
|
-
def domain
|
16
|
-
schema.domain
|
17
|
-
end
|
18
|
-
|
19
|
-
def evaluate(types_proc)
|
20
|
-
instance_exec &types_proc
|
21
|
-
end
|
22
|
-
|
23
|
-
def compile
|
24
|
-
data.merge "#{condition}Of" => map(&:compile)
|
25
|
-
end
|
26
|
-
|
27
|
-
def data
|
28
|
-
@data ||= {}
|
29
|
-
end
|
30
|
-
|
31
|
-
SchemaCreation.apply_to(self) { |schema| push schema }
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
data/lib/jimmy/definitions.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
module Jimmy
|
4
|
-
class Definitions
|
5
|
-
include SchemaCreation::Referencing
|
6
|
-
extend Forwardable
|
7
|
-
delegate %i[empty? key? map] => :@values
|
8
|
-
|
9
|
-
attr_reader :schema
|
10
|
-
|
11
|
-
def initialize(schema)
|
12
|
-
@schema = schema
|
13
|
-
@values = {}
|
14
|
-
end
|
15
|
-
|
16
|
-
def evaluate(&block)
|
17
|
-
instance_exec &block
|
18
|
-
end
|
19
|
-
|
20
|
-
def domain
|
21
|
-
schema.domain
|
22
|
-
end
|
23
|
-
|
24
|
-
def compile
|
25
|
-
map { |k, v| [k.to_s, v.compile] }.to_h
|
26
|
-
end
|
27
|
-
|
28
|
-
def data
|
29
|
-
schema.data
|
30
|
-
end
|
31
|
-
|
32
|
-
def [](key)
|
33
|
-
@values[key] || (schema.parent && schema.parent.definitions[key])
|
34
|
-
end
|
35
|
-
|
36
|
-
SchemaCreation.apply_to(self) { |schema, name| @values[name] = schema }
|
37
|
-
end
|
38
|
-
end
|
data/lib/jimmy/domain.rb
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'pathname'
|
3
|
-
require 'json'
|
4
|
-
require 'json-schema'
|
5
|
-
|
6
|
-
require_relative 'schema_creation'
|
7
|
-
|
8
|
-
module Jimmy
|
9
|
-
class Domain
|
10
|
-
DEFAULT_OPTIONS = {
|
11
|
-
transform_keys: nil
|
12
|
-
}
|
13
|
-
|
14
|
-
attr_reader :root, :types, :partials, :options, :schemas
|
15
|
-
|
16
|
-
def initialize(root, **options)
|
17
|
-
@root = URI(root)
|
18
|
-
@schemas = {}
|
19
|
-
@types = {}
|
20
|
-
@partials = {}
|
21
|
-
@import_paths = []
|
22
|
-
@uri_formatter = -> _, name { @root + "#{name}.json#" }
|
23
|
-
@options = DEFAULT_OPTIONS.merge(options)
|
24
|
-
end
|
25
|
-
|
26
|
-
def domain
|
27
|
-
self
|
28
|
-
end
|
29
|
-
|
30
|
-
def import(path)
|
31
|
-
path = Pathname(path) unless path.is_a? Pathname
|
32
|
-
@import_paths << path unless @import_paths.include? path
|
33
|
-
|
34
|
-
glob path, only: 'types' do |name, schema|
|
35
|
-
@types[name.to_sym] = schema
|
36
|
-
end
|
37
|
-
|
38
|
-
glob path, only: 'partials' do |name|
|
39
|
-
partial_path = path + 'partials' + "#{name}.rb"
|
40
|
-
@partials[name] = [partial_path.read, partial_path.to_s]
|
41
|
-
end
|
42
|
-
|
43
|
-
glob path, ignore: %r`^(types|partials)/` do |name, schema|
|
44
|
-
@schemas[name] = schema
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def autoload_type(name)
|
49
|
-
# TODO: protect from circular dependency
|
50
|
-
return if types.key? name
|
51
|
-
@import_paths.each do |import_path|
|
52
|
-
path = import_path + "types/#{name}.rb"
|
53
|
-
if path.file?
|
54
|
-
@types[name] = load_schema_from_path(path, name)
|
55
|
-
return true
|
56
|
-
end
|
57
|
-
end
|
58
|
-
false
|
59
|
-
end
|
60
|
-
|
61
|
-
def [](schema_name)
|
62
|
-
@schemas[schema_name.to_s]
|
63
|
-
end
|
64
|
-
|
65
|
-
def export(path = nil, &serializer)
|
66
|
-
path = Pathname(path) if path.is_a? String
|
67
|
-
raise 'Please specify an export directory' unless path.is_a?(Pathname) && (path.directory? || !path.exist?)
|
68
|
-
path.mkpath
|
69
|
-
@schemas.each { |name, schema| export_schema schema, path + "#{name.to_s}.json", &serializer }
|
70
|
-
@types.each { |name, schema| export_schema schema, path + 'types' + "#{name.to_s}.json", &serializer }
|
71
|
-
end
|
72
|
-
|
73
|
-
def uri_for(name)
|
74
|
-
@uri_formatter.call root, name
|
75
|
-
end
|
76
|
-
|
77
|
-
def uri_format(&block)
|
78
|
-
@uri_formatter = block
|
79
|
-
end
|
80
|
-
|
81
|
-
private
|
82
|
-
|
83
|
-
def glob(base_path, only: '.', ignore: nil, &block)
|
84
|
-
lookup_path = base_path + only
|
85
|
-
Dir[lookup_path + '**/*.rb'].each do |full_path|
|
86
|
-
full_path = Pathname(full_path)
|
87
|
-
relative_path = full_path.relative_path_from(lookup_path)
|
88
|
-
next if ignore === relative_path.to_s
|
89
|
-
args = [relative_path.to_s[0..-4]]
|
90
|
-
args << load_schema_from_path(full_path, full_path.relative_path_from(base_path).to_s[0..-4]) if block.arity == 2
|
91
|
-
yield *args
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def load_schema_from_path(path, name)
|
96
|
-
@schema_name = name
|
97
|
-
instance_eval(path.read, path.to_s).schema.tap do |schema|
|
98
|
-
schema.name = name.to_s
|
99
|
-
JSON::Validator.add_schema JSON::Schema.new(schema.to_h, nil)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def export_schema(schema, target_path)
|
104
|
-
target_path.parent.mkpath
|
105
|
-
target_path.write block_given? ? yield(schema.to_h) : JSON.pretty_generate(schema.to_h)
|
106
|
-
end
|
107
|
-
|
108
|
-
SchemaCreation.apply_to self
|
109
|
-
|
110
|
-
end
|
111
|
-
end
|
data/lib/jimmy/link.rb
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
module Jimmy
|
4
|
-
class Link < Hash
|
5
|
-
attr_reader :schema
|
6
|
-
|
7
|
-
def initialize(schema, rel, href)
|
8
|
-
@schema = schema
|
9
|
-
merge! 'rel' => rel.to_s,
|
10
|
-
'href' => href.to_s
|
11
|
-
end
|
12
|
-
|
13
|
-
def dsl
|
14
|
-
@dsl ||= DSL.new(self)
|
15
|
-
end
|
16
|
-
|
17
|
-
def schemas
|
18
|
-
@schemas ||= {}
|
19
|
-
end
|
20
|
-
|
21
|
-
def domain
|
22
|
-
schema.domain
|
23
|
-
end
|
24
|
-
|
25
|
-
def compile
|
26
|
-
merge schemas.map { |k, v| [(k ? "#{k}Schema" : 'schema'), v.compile] }.to_h
|
27
|
-
end
|
28
|
-
|
29
|
-
def schema_creator
|
30
|
-
@schema_creator ||= SchemaCreator.new(self)
|
31
|
-
end
|
32
|
-
|
33
|
-
class SchemaCreator < Hash
|
34
|
-
include SchemaCreation::Referencing
|
35
|
-
extend Forwardable
|
36
|
-
delegate [:schema, :domain] => :@link
|
37
|
-
|
38
|
-
def initialize(link)
|
39
|
-
@link = link
|
40
|
-
end
|
41
|
-
|
42
|
-
def parent
|
43
|
-
schema
|
44
|
-
end
|
45
|
-
|
46
|
-
SchemaCreation.apply_to(self) { |schema, prefix| @link.schemas[prefix] = schema }
|
47
|
-
end
|
48
|
-
|
49
|
-
class DSL
|
50
|
-
attr_reader :link
|
51
|
-
|
52
|
-
def initialize(link)
|
53
|
-
@link = link
|
54
|
-
end
|
55
|
-
|
56
|
-
def domain
|
57
|
-
link.domain
|
58
|
-
end
|
59
|
-
|
60
|
-
def title(value)
|
61
|
-
link['title'] = value
|
62
|
-
end
|
63
|
-
|
64
|
-
def method(value)
|
65
|
-
link['method'] = value.to_s.upcase
|
66
|
-
end
|
67
|
-
|
68
|
-
def evaluate(&block)
|
69
|
-
instance_exec &block
|
70
|
-
end
|
71
|
-
|
72
|
-
def schema(*args, prefix: nil, **opts, &block)
|
73
|
-
if args.empty? && opts.any?
|
74
|
-
args = opts.shift
|
75
|
-
type = args.shift
|
76
|
-
else
|
77
|
-
type = args.shift || :object
|
78
|
-
end
|
79
|
-
args.unshift type, prefix
|
80
|
-
args << opts if opts.any?
|
81
|
-
link.schema_creator.__send__ *args, &block
|
82
|
-
end
|
83
|
-
|
84
|
-
def target_schema(*args, **opts, &block)
|
85
|
-
schema *args, **opts.merge(prefix: :target), &block
|
86
|
-
end
|
87
|
-
|
88
|
-
def set(**values)
|
89
|
-
values.each { |k, v| link[k.to_s] = v }
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|