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.
Files changed (69) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +35 -0
  3. data/.gitignore +4 -3
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +61 -0
  6. data/.ruby-version +1 -1
  7. data/.travis.yml +6 -0
  8. data/CODE_OF_CONDUCT.md +74 -0
  9. data/Gemfile +13 -0
  10. data/LICENSE +1 -1
  11. data/README.md +22 -134
  12. data/Rakefile +91 -1
  13. data/bin/console +15 -0
  14. data/bin/setup +8 -0
  15. data/jimmy.gemspec +25 -21
  16. data/lib/jimmy.rb +23 -15
  17. data/lib/jimmy/declaration.rb +150 -0
  18. data/lib/jimmy/declaration/assertion.rb +81 -0
  19. data/lib/jimmy/declaration/casting.rb +34 -0
  20. data/lib/jimmy/declaration/composites.rb +41 -0
  21. data/lib/jimmy/declaration/number.rb +27 -0
  22. data/lib/jimmy/declaration/object.rb +11 -0
  23. data/lib/jimmy/declaration/string.rb +100 -0
  24. data/lib/jimmy/declaration/types.rb +57 -0
  25. data/lib/jimmy/error.rb +9 -0
  26. data/lib/jimmy/file_map.rb +166 -0
  27. data/lib/jimmy/index.rb +78 -0
  28. data/lib/jimmy/json/array.rb +93 -0
  29. data/lib/jimmy/json/collection.rb +90 -0
  30. data/lib/jimmy/json/hash.rb +118 -0
  31. data/lib/jimmy/json/pointer.rb +119 -0
  32. data/lib/jimmy/json/uri.rb +144 -0
  33. data/lib/jimmy/loaders/base.rb +30 -0
  34. data/lib/jimmy/loaders/json.rb +15 -0
  35. data/lib/jimmy/loaders/ruby.rb +21 -0
  36. data/lib/jimmy/macros.rb +37 -0
  37. data/lib/jimmy/schema.rb +106 -86
  38. data/lib/jimmy/schema/array.rb +95 -0
  39. data/lib/jimmy/schema/casting.rb +17 -0
  40. data/lib/jimmy/schema/json.rb +40 -0
  41. data/lib/jimmy/schema/number.rb +47 -0
  42. data/lib/jimmy/schema/object.rb +108 -0
  43. data/lib/jimmy/schema/operators.rb +96 -0
  44. data/lib/jimmy/schema/string.rb +44 -0
  45. data/lib/jimmy/schema_with_uri.rb +53 -0
  46. data/lib/jimmy/schemer_factory.rb +65 -0
  47. data/lib/jimmy/version.rb +3 -1
  48. data/schema07.json +172 -0
  49. metadata +50 -101
  50. data/circle.yml +0 -11
  51. data/lib/jimmy/combination.rb +0 -34
  52. data/lib/jimmy/definitions.rb +0 -38
  53. data/lib/jimmy/domain.rb +0 -111
  54. data/lib/jimmy/link.rb +0 -93
  55. data/lib/jimmy/reference.rb +0 -39
  56. data/lib/jimmy/schema_creation.rb +0 -121
  57. data/lib/jimmy/schema_type.rb +0 -100
  58. data/lib/jimmy/schema_types.rb +0 -42
  59. data/lib/jimmy/schema_types/array.rb +0 -30
  60. data/lib/jimmy/schema_types/boolean.rb +0 -6
  61. data/lib/jimmy/schema_types/integer.rb +0 -8
  62. data/lib/jimmy/schema_types/null.rb +0 -6
  63. data/lib/jimmy/schema_types/number.rb +0 -34
  64. data/lib/jimmy/schema_types/object.rb +0 -45
  65. data/lib/jimmy/schema_types/string.rb +0 -40
  66. data/lib/jimmy/symbol_array.rb +0 -17
  67. data/lib/jimmy/transform_keys.rb +0 -39
  68. data/lib/jimmy/type_reference.rb +0 -10
  69. 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.5.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil E. Pearson
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-08 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
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.pearson@orionvm.com
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
- - circle.yml
31
+ - bin/console
32
+ - bin/setup
97
33
  - jimmy.gemspec
98
34
  - lib/jimmy.rb
99
- - lib/jimmy/combination.rb
100
- - lib/jimmy/definitions.rb
101
- - lib/jimmy/domain.rb
102
- - lib/jimmy/link.rb
103
- - lib/jimmy/reference.rb
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/schema_creation.rb
106
- - lib/jimmy/schema_type.rb
107
- - lib/jimmy/schema_types.rb
108
- - lib/jimmy/schema_types/array.rb
109
- - lib/jimmy/schema_types/boolean.rb
110
- - lib/jimmy/schema_types/integer.rb
111
- - lib/jimmy/schema_types/null.rb
112
- - lib/jimmy/schema_types/number.rb
113
- - lib/jimmy/schema_types/object.rb
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: '0'
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
- rubyforge_project:
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 JSON Schema DSL
92
+ summary: Jimmy the Gem
144
93
  test_files: []
data/circle.yml DELETED
@@ -1,11 +0,0 @@
1
- machine:
2
- ruby:
3
- version: '2.1.5'
4
-
5
- dependencies:
6
- pre:
7
- - gem install bundler -v '~>1.9'
8
-
9
- test:
10
- override:
11
- - bundle exec rake spec
@@ -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
@@ -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
@@ -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
@@ -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