json_model_rb 0.1.20 → 0.1.23

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +156 -572
  3. data/lib/json_model/builder/alias_builder.rb +10 -0
  4. data/lib/json_model/builder/array_builder.rb +24 -0
  5. data/lib/json_model/builder/base_builder.rb +24 -0
  6. data/lib/json_model/builder/composition/any_of_builder.rb +16 -0
  7. data/lib/json_model/builder/composition/builder.rb +47 -0
  8. data/lib/json_model/builder/composition/intersection_builder.rb +16 -0
  9. data/lib/json_model/builder/composition/one_of_builder.rb +16 -0
  10. data/lib/json_model/builder/composition/sum_builder.rb +16 -0
  11. data/lib/json_model/builder/composition.rb +6 -0
  12. data/lib/json_model/builder/constrained_builder.rb +83 -0
  13. data/lib/json_model/builder/default_builder.rb +14 -0
  14. data/lib/json_model/builder/enum_builder.rb +16 -0
  15. data/lib/json_model/builder/format_builder.rb +47 -0
  16. data/lib/json_model/builder/key_builder.rb +30 -0
  17. data/lib/json_model/builder/nested_builder.rb +31 -0
  18. data/lib/json_model/builder/primitive/boolean_builder.rb +16 -0
  19. data/lib/json_model/builder/primitive/builder.rb +25 -0
  20. data/lib/json_model/builder/primitive/integer_builder.rb +16 -0
  21. data/lib/json_model/builder/primitive/null_builder.rb +16 -0
  22. data/lib/json_model/builder/primitive/number_builder.rb +16 -0
  23. data/lib/json_model/builder/primitive/string_builder.rb +16 -0
  24. data/lib/json_model/builder/primitive.rb +7 -0
  25. data/lib/json_model/builder/ref_builder.rb +35 -0
  26. data/lib/json_model/builder/schema_builder.rb +14 -0
  27. data/lib/json_model/builder.rb +65 -0
  28. data/lib/json_model/config/options.rb +5 -2
  29. data/lib/json_model/config.rb +0 -2
  30. data/lib/json_model/errors.rb +0 -3
  31. data/lib/json_model/logic/predicates/methods.rb +17 -0
  32. data/lib/json_model/predicates.rb +3 -0
  33. data/lib/json_model/schema.rb +54 -78
  34. data/lib/json_model/schema_meta.rb +7 -28
  35. data/lib/json_model/types/alias.rb +33 -0
  36. data/lib/json_model/types/any_of.rb +51 -20
  37. data/lib/json_model/types/one_of.rb +51 -20
  38. data/lib/json_model/types/ref.rb +32 -0
  39. data/lib/json_model/types.rb +47 -9
  40. data/lib/json_model/version.rb +1 -1
  41. data/lib/json_model.rb +3 -7
  42. data/spec/config_spec.rb +0 -14
  43. data/spec/examples/file_system_spec.rb +71 -31
  44. data/spec/examples/user_spec.rb +69 -40
  45. data/spec/schema_meta_spec.rb +0 -40
  46. data/spec/schema_spec.rb +43 -59
  47. metadata +84 -58
  48. data/lib/json_model/composeable.rb +0 -35
  49. data/lib/json_model/errors/invalid_ref_mode_error.rb +0 -12
  50. data/lib/json_model/errors/type_error.rb +0 -8
  51. data/lib/json_model/errors/unknown_attribute_error.rb +0 -13
  52. data/lib/json_model/properties.rb +0 -86
  53. data/lib/json_model/property.rb +0 -54
  54. data/lib/json_model/ref_mode.rb +0 -9
  55. data/lib/json_model/type_spec/array.rb +0 -72
  56. data/lib/json_model/type_spec/castable.rb +0 -34
  57. data/lib/json_model/type_spec/composition/all_of.rb +0 -29
  58. data/lib/json_model/type_spec/composition/any_of.rb +0 -34
  59. data/lib/json_model/type_spec/composition/one_of.rb +0 -38
  60. data/lib/json_model/type_spec/composition.rb +0 -79
  61. data/lib/json_model/type_spec/const.rb +0 -35
  62. data/lib/json_model/type_spec/enum.rb +0 -35
  63. data/lib/json_model/type_spec/object.rb +0 -32
  64. data/lib/json_model/type_spec/primitive/boolean.rb +0 -13
  65. data/lib/json_model/type_spec/primitive/integer.rb +0 -21
  66. data/lib/json_model/type_spec/primitive/null.rb +0 -13
  67. data/lib/json_model/type_spec/primitive/number.rb +0 -14
  68. data/lib/json_model/type_spec/primitive/numeric.rb +0 -85
  69. data/lib/json_model/type_spec/primitive/string.rb +0 -150
  70. data/lib/json_model/type_spec/primitive.rb +0 -40
  71. data/lib/json_model/type_spec.rb +0 -82
  72. data/lib/json_model/types/all_of.rb +0 -29
  73. data/lib/json_model/types/array.rb +0 -29
  74. data/lib/json_model/types/boolean.rb +0 -7
  75. data/lib/json_model/types/const.rb +0 -23
  76. data/lib/json_model/types/enum.rb +0 -23
  77. data/lib/json_model/types/integer.rb +0 -23
  78. data/lib/json_model/types/null.rb +0 -7
  79. data/lib/json_model/types/number.rb +0 -23
  80. data/lib/json_model/types/string.rb +0 -23
  81. data/spec/properties_spec.rb +0 -76
  82. data/spec/property_spec.rb +0 -86
  83. data/spec/type_spec/array_spec.rb +0 -206
  84. data/spec/type_spec/castable_spec.rb +0 -19
  85. data/spec/type_spec/composition/all_of_spec.rb +0 -57
  86. data/spec/type_spec/composition/any_of_spec.rb +0 -54
  87. data/spec/type_spec/composition/one_of_spec.rb +0 -59
  88. data/spec/type_spec/composition_spec.rb +0 -90
  89. data/spec/type_spec/const_spec.rb +0 -18
  90. data/spec/type_spec/enum_spec.rb +0 -84
  91. data/spec/type_spec/primitive/boolean_spec.rb +0 -12
  92. data/spec/type_spec/primitive/integer_spec.rb +0 -57
  93. data/spec/type_spec/primitive/null_spec.rb +0 -12
  94. data/spec/type_spec/primitive/number_spec.rb +0 -12
  95. data/spec/type_spec/primitive/numeric_spec.rb +0 -176
  96. data/spec/type_spec/primitive/string_spec.rb +0 -119
  97. data/spec/type_spec_spec.rb +0 -32
@@ -1,6 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative('errors/error')
4
- require_relative('errors/invalid_ref_mode_error')
5
- require_relative('errors/type_error')
6
- require_relative('errors/unknown_attribute_error')
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsonModel
4
+ module Logic
5
+ module Predicates
6
+ module Methods
7
+ # @param [Array] value
8
+ # @return [FalseClass, TrueClass]
9
+ def unique?(value)
10
+ value.respond_to?(:uniq) && value.uniq.size == value.size
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ Dry::Logic::Predicates::Methods.prepend(JsonModel::Logic::Predicates::Methods)
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative('logic/predicates/methods')
@@ -1,122 +1,98 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative('builder')
4
+ require_relative('schema_meta')
5
+
3
6
  module JsonModel
4
7
  module Schema
5
8
  extend(ActiveSupport::Concern)
6
- include(Composeable)
7
- include(Properties)
8
9
  include(SchemaMeta)
9
10
 
10
- # @param [Hash, nil] attributes
11
- def initialize(attributes = nil)
12
- return unless attributes
13
-
14
- assign_attributes(attributes)
15
-
16
- if JsonModel.config.validate_after_instantiation
17
- validate!
18
- end
19
- end
20
-
21
- private
22
-
23
- # @param [Hash, nil] attributes
24
- def assign_attributes(attributes)
25
- attributes.each { |name, value| assign_attribute(name, value) }
26
- end
27
-
28
- # @param [Symbol] name
29
- # @param [Object] value
30
- def assign_attribute(name, value)
31
- if respond_to?("#{name}=")
32
- send("#{name}=", value)
33
- else
34
- self.class.raise_unknown_attribute_error(name)
35
- end
36
- end
37
-
38
11
  class_methods do
39
12
  # @param [::Object] json
40
13
  # @return [::Object, nil]
41
14
  def from_json(json)
42
- attributes = json.transform_keys { |key| invert_alias(key) || raise_unknown_attribute_error(key) }
15
+ attributes = json.transform_keys { |key| invert_alias(key) }
43
16
  new(attributes)
44
17
  end
45
18
 
46
- # @param [Symbol] name
47
- def raise_unknown_attribute_error(name)
48
- if !additional_properties && JsonModel.config.validate_after_instantiation
49
- raise(Errors::UnknownAttributeError.new(self, name))
50
- end
19
+ # @param [Symbol] key
20
+ # @return [Symbol]
21
+ def invert_alias(key)
22
+ builder = local_builders.find { |b| b.alias.to_s == key.to_s }
23
+ builder&.type&.name || key
51
24
  end
52
25
 
53
- # @param [Symbol] ref_mode
54
- # @param [Hash] _options
55
26
  # @return [Hash]
56
- def as_schema(ref_mode: RefMode::INLINE, **_options)
57
- case ref_mode
58
- when RefMode::INLINE
59
- meta_attributes
60
- .merge(
61
- properties: properties_as_schema,
62
- required: required_properties_as_schema,
63
- '$defs': defs_as_schema,
64
- )
65
- .merge(**composed_types_as_schema)
66
- .merge(type: 'object')
67
- .compact
68
- when RefMode::LOCAL
69
- { '$ref': "#/$defs/#{name}" }
70
- when RefMode::EXTERNAL
71
- { '$ref': schema_id }
72
- else
73
- raise(Errors::InvalidRefModeError, ref_mode)
74
- end
27
+ def as_schema
28
+ {
29
+ properties: properties_as_schema,
30
+ required: required_properties_as_schema,
31
+ '$defs': defs_as_schema,
32
+ }
33
+ .merge(type: 'object')
34
+ .merge(meta_attributes)
35
+ .compact
75
36
  end
76
37
 
77
38
  # @return [Hash, nil]
78
39
  def properties_as_schema
79
- if local_properties.any?
80
- local_properties
81
- .sort_by { |key, _property| key }
82
- .map { |_key, property| property.as_schema }
40
+ if local_builders.any?
41
+ local_builders
42
+ .sort_by(&:alias)
43
+ .map(&:as_schema)
83
44
  .inject({}, &:merge)
84
45
  end
85
46
  end
86
47
 
87
48
  # @return [Array, nil]
88
49
  def required_properties_as_schema
89
- if local_properties.any?
90
- local_properties
91
- .values
92
- .select(&:required?)
50
+ if local_builders.any?
51
+ local_builders
52
+ .reject(&:optional?)
93
53
  .map(&:alias)
94
54
  .sort
95
55
  end
96
56
  end
97
57
 
58
+ # @return [Hash, nil]
98
59
  def defs_as_schema
99
- referenced_schemas = (composed_type_defs + local_properties.values.flat_map(&:referenced_schemas)).uniq
60
+ referenced_schemas = local_builders
61
+ .flat_map(&:referenced_schemas)
62
+ .uniq
63
+
100
64
  if referenced_schemas.any?
101
65
  referenced_schemas.to_h { |type| [type.name.to_sym, type.as_schema] }
102
66
  end
103
67
  end
104
68
 
105
- # @return [Array<Class>]
106
- def parent_schemas
107
- @parent_schemas ||= ancestors.select { |klass| klass != self && klass < Schema }
69
+ # @return [Array<Builder>]
70
+ def local_builders
71
+ @local_builders ||= @schema
72
+ .type
73
+ .reject { |type| parent_keys.include?(type) }
74
+ .map { |type| Builder.for(type) }
108
75
  end
109
76
 
110
- # @return [Hash]
111
- def local_properties
112
- if !defined?(@local_properties)
113
- ancestor_properties = parent_schemas.flat_map { |property| property.properties.values }
114
- @local_properties = properties.select do |_key, property|
115
- ancestor_properties.none? { |ancestor_property| ancestor_property.as_schema == property.as_schema }
116
- end
117
- end
77
+ # @return [Array<Builder>]
78
+ def builders
79
+ @builders ||= @local_builders + @schema
80
+ .type
81
+ .select { |type| parent_keys.include?(type) }
82
+ .map { |type| Builder.for(type) }
83
+ end
84
+
85
+ # @return [Array<Class>]
86
+ def parent_keys
87
+ @parent_keys ||= ancestors
88
+ .select { |klass| referenceable_parent?(klass) }
89
+ .flat_map { |klass| klass.schema.type.keys }
90
+ end
118
91
 
119
- @local_properties
92
+ # @param [Class] klass
93
+ # @return [FalseClass, TrueClass]
94
+ def referenceable_parent?(klass)
95
+ klass < JsonModel::Schema && klass != self && schema_id != klass.schema_id
120
96
  end
121
97
  end
122
98
  end
@@ -16,8 +16,7 @@ module JsonModel
16
16
  # @param [Class] subclass
17
17
  def self.inherited(subclass)
18
18
  super
19
- subclass.schema_id(JsonModel.config.schema_id_naming_strategy.call(subclass))
20
- subclass.schema_version(JsonModel.config.schema_version)
19
+ subclass.meta_attributes.merge!(meta_attributes.dup)
21
20
  subclass.meta_attributes[:$ref] = schema_id
22
21
  end
23
22
 
@@ -26,11 +25,6 @@ module JsonModel
26
25
  end
27
26
 
28
27
  class_methods do
29
- # @return [Hash]
30
- def meta_attributes
31
- @meta_attributes ||= {}
32
- end
33
-
34
28
  # @param [String, nil] description
35
29
  # @return [String, nil]
36
30
  def description(description = nil)
@@ -61,28 +55,8 @@ module JsonModel
61
55
  end
62
56
  end
63
57
 
64
- # @param [Boolean, nil] value
65
- # @return [Boolean]
66
- def additional_properties(value = nil)
67
- if value.nil?
68
- meta_attributes[:additionalProperties] || false
69
- else
70
- meta_attributes[:additionalProperties] = value
71
- end
72
- end
73
-
74
- # @param [Boolean, nil] value
75
- # @return [Boolean]
76
- def unevaluated_properties(value = nil)
77
- if value.nil?
78
- meta_attributes[:unevaluatedProperties] || false
79
- else
80
- meta_attributes[:unevaluatedProperties] = value
81
- end
82
- end
83
-
84
58
  # @param [Symbol, nil] version
85
- # @return [Boolean]
59
+ # @return [TrueClass, FalseClass]
86
60
  def schema_version(version = nil)
87
61
  if version.nil?
88
62
  meta_attributes[:$schema]
@@ -90,6 +64,11 @@ module JsonModel
90
64
  meta_attributes[:$schema] = SCHEMA_VERSIONS[version]
91
65
  end
92
66
  end
67
+
68
+ # @return [Hash]
69
+ def meta_attributes
70
+ @meta_attributes ||= { unevaluatedProperties: @schema&.strict? ? false : nil }.compact
71
+ end
93
72
  end
94
73
  end
95
74
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsonModel
4
+ module Types
5
+ class Alias < Dry::Types::Constructor
6
+ # @return [Array]
7
+ def to_ast
8
+ [
9
+ :alias,
10
+ [
11
+ options[:as],
12
+ type.to_ast,
13
+ ],
14
+ ]
15
+ end
16
+
17
+ # @return [Symbol]
18
+ def alias
19
+ options[:as]
20
+ end
21
+
22
+ module Builder
23
+ # @param [Symbol] name
24
+ # @return [Alias]
25
+ def as(name)
26
+ Alias.new(self, as: name) { |input| input }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ Dry::Types::Builder.prepend(JsonModel::Types::Alias::Builder)
@@ -1,28 +1,59 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module T
4
- class AnyOf
5
- # @param [Array<Class>] types
6
- # @param [Hash] options
7
- def initialize(*types, **options)
8
- @types = types
9
- @options = options
3
+ module JsonModel
4
+ module Types
5
+ class << self
6
+ # @param [Symbol] tag_key
7
+ # @return [AnyOf]
8
+ def any_of(tag_key, &)
9
+ builder = AnyOf::Builder.new(tag_key)
10
+ builder.instance_eval(&)
11
+ builder.build
12
+ end
10
13
  end
11
14
 
12
- # @return [JsonModel::TypeSpec::Composition::AnyOf]
13
- def to_type_spec
14
- JsonModel::TypeSpec::Composition::AnyOf.new(
15
- *@types.map { |type| JsonModel::TypeSpec.resolve(type) },
16
- **@options,
17
- )
18
- end
15
+ class AnyOf < Dry::Types::Constructor
16
+ attr_reader(:tag_key, :mapping)
19
17
 
20
- class << self
21
- # @param [Array] types
22
- # @param [Hash] options
23
- # @return [AnyOf]
24
- def [](*types, **options)
25
- AnyOf.new(*types, **options)
18
+ # @return [Array]
19
+ def to_ast
20
+ [
21
+ :any_of,
22
+ {
23
+ tag_key: options[:tag_key],
24
+ mapping: options[:mapping].transform_values do |type|
25
+ type.respond_to?(:to_ast) ? type.to_ast : type.class.name
26
+ end,
27
+ meta: meta,
28
+ },
29
+ ]
30
+ end
31
+
32
+ class Builder
33
+ attr_reader(:tag_key, :mapping)
34
+
35
+ # @param [Symbol] tag_key
36
+ def initialize(tag_key)
37
+ @tag_key = tag_key
38
+ @mapping = {}
39
+ end
40
+
41
+ # @param [Array<Symbol>] tags
42
+ # @param [Dry::Types::Type] type
43
+ def on(*tags, type)
44
+ tags.each { |tag| mapping[tag] = type }
45
+ end
46
+
47
+ # @return [AnyOf]
48
+ def build
49
+ AnyOf.new(mapping.values.map(&:type).uniq.reduce(&:|), tag_key: tag_key, mapping: mapping) do |input|
50
+ tag = input[tag_key]
51
+ type = mapping[tag]
52
+ raise(Dry::Types::ConstraintError, "Unknown tag #{tag.inspect}") unless type
53
+
54
+ type[input]
55
+ end
56
+ end
26
57
  end
27
58
  end
28
59
  end
@@ -1,28 +1,59 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module T
4
- class OneOf
5
- # @param [Array<Class>] types
6
- # @param [Hash] options
7
- def initialize(*types, **options)
8
- @types = types
9
- @options = options
3
+ module JsonModel
4
+ module Types
5
+ class << self
6
+ # @param [Symbol] tag_key
7
+ # @return [OneOf]
8
+ def one_of(tag_key, &)
9
+ builder = OneOf::Builder.new(tag_key)
10
+ builder.instance_eval(&)
11
+ builder.build
12
+ end
10
13
  end
11
14
 
12
- # @return [JsonModel::TypeSpec::Composition::OneOf]
13
- def to_type_spec
14
- JsonModel::TypeSpec::Composition::OneOf.new(
15
- *@types.map { |type| JsonModel::TypeSpec.resolve(type) },
16
- **@options,
17
- )
18
- end
15
+ class OneOf < Dry::Types::Constructor
16
+ attr_reader(:tag_key, :mapping)
19
17
 
20
- class << self
21
- # @param [Array] types
22
- # @param [Hash] options
23
- # @return [OneOf]
24
- def [](*types, **options)
25
- OneOf.new(*types, **options)
18
+ # @return [Array]
19
+ def to_ast
20
+ [
21
+ :one_of,
22
+ {
23
+ tag_key: options[:tag_key],
24
+ mapping: options[:mapping].transform_values do |type|
25
+ type.respond_to?(:to_ast) ? type.to_ast : type.class.name
26
+ end,
27
+ meta: meta,
28
+ },
29
+ ]
30
+ end
31
+
32
+ class Builder
33
+ attr_reader(:tag_key, :mapping)
34
+
35
+ # @param [Symbol] tag_key
36
+ def initialize(tag_key)
37
+ @tag_key = tag_key
38
+ @mapping = {}
39
+ end
40
+
41
+ # @param [Array<Symbol>] tags
42
+ # @param [Dry::Types::Type] type
43
+ def on(*tags, type)
44
+ tags.each { |tag| mapping[tag] = type }
45
+ end
46
+
47
+ # @return [OneOf]
48
+ def build
49
+ OneOf.new(mapping.values.uniq.reduce(&:|), tag_key: tag_key, mapping: mapping) do |input|
50
+ tag = input[tag_key]
51
+ type = mapping[tag]
52
+ raise(Dry::Types::ConstraintError, "Unknown tag #{tag.inspect}") unless type
53
+
54
+ type[input]
55
+ end
56
+ end
26
57
  end
27
58
  end
28
59
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JsonModel
4
+ module Types
5
+ class Ref < Dry::Types::Constructor
6
+ # @return [Array]
7
+ def to_ast
8
+ [
9
+ :ref,
10
+ [
11
+ options[:mode],
12
+ type.to_ast,
13
+ ],
14
+ ]
15
+ end
16
+
17
+ module Builder
18
+ # @return [Ref]
19
+ def external
20
+ Ref.new(self, mode: :external) { |input| input }
21
+ end
22
+
23
+ # @return [Ref]
24
+ def local
25
+ Ref.new(self, mode: :local) { |input| input }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ Dry::Types::Builder.prepend(JsonModel::Types::Ref::Builder)
@@ -1,13 +1,51 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative('types/all_of')
3
+ require('resolv')
4
+ require_relative('types/alias')
4
5
  require_relative('types/any_of')
5
- require_relative('types/array')
6
- require_relative('types/boolean')
7
- require_relative('types/const')
8
- require_relative('types/enum')
9
- require_relative('types/integer')
10
- require_relative('types/null')
11
- require_relative('types/number')
12
6
  require_relative('types/one_of')
13
- require_relative('types/string')
7
+ require_relative('types/ref')
8
+
9
+ module JsonModel
10
+ module Types
11
+ include(Dry.Types())
12
+
13
+ Date = Dry::Types['date'].meta(format: 'date')
14
+
15
+ DateTime = Dry::Types['date_time'].meta(format: 'date-time')
16
+
17
+ Email = String.constrained(format: URI::MailTo::EMAIL_REGEXP).meta(format: 'email')
18
+
19
+ Hostname = String.constrained(
20
+ format: /(?i)^(?:([a-z0-9-]+|\*)\.)?([a-z0-9-]{1,61})\.([a-z0-9]{2,7})$/,
21
+ ).meta(format: 'hostname')
22
+
23
+ IPv4 = String.constrained(
24
+ format: ::Resolv::IPv4::Regex,
25
+ ).meta(format: 'ipv4')
26
+
27
+ IPv6 = String.constrained(
28
+ format: ::Resolv::IPv6::Regex,
29
+ ).meta(format: 'ipv6')
30
+
31
+ Time = Dry::Types['time'].meta(format: 'time')
32
+
33
+ UUID = String.constrained(
34
+ format: /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/,
35
+ ).meta(format: 'uuid')
36
+
37
+ URI = String.constrained(
38
+ format: ::URI::DEFAULT_PARSER.make_regexp,
39
+ ).meta(format: 'uri')
40
+
41
+ UriReference = String.constrained(
42
+ format: %r{^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?},
43
+ ).meta(format: 'uri-reference')
44
+
45
+ Regex = String.constrained(
46
+ format: %r{\A(/?)(.+)\1([a-z]*)\z}i,
47
+ ).meta(format: 'regex')
48
+
49
+ UniqueArray = Array.constrained(unique: true)
50
+ end
51
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JsonModel
4
- VERSION = '0.1.20'
4
+ VERSION = '0.1.23'
5
5
  end
data/lib/json_model.rb CHANGED
@@ -1,19 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require('active_model')
4
3
  require('active_support/concern')
5
4
  require('active_support/core_ext/class/attribute')
6
5
  require('active_support/descendants_tracker')
6
+ require('dry-struct')
7
+ require('dry-validation')
7
8
  require('uri')
8
- require('json_model/composeable')
9
9
  require('json_model/config')
10
10
  require('json_model/errors')
11
- require('json_model/properties')
12
- require('json_model/property')
13
- require('json_model/ref_mode')
14
- require('json_model/schema_meta')
11
+ require('json_model/predicates')
15
12
  require('json_model/schema')
16
- require('json_model/type_spec')
17
13
  require('json_model/types')
18
14
  require('json_model/version')
19
15
 
data/spec/config_spec.rb CHANGED
@@ -33,20 +33,6 @@ RSpec.describe(JsonModel::Config) do
33
33
  end
34
34
  end
35
35
 
36
- describe('#validate_after_instantiation') do
37
- it('defaults to true') do
38
- expect(JsonModel.config.validate_after_instantiation)
39
- .to(eq(true))
40
- end
41
-
42
- it('can be changed to false') do
43
- JsonModel.configure { |config| config.validate_after_instantiation = false }
44
-
45
- expect(JsonModel.config.validate_after_instantiation)
46
- .to(eq(false))
47
- end
48
- end
49
-
50
36
  describe('#schema_id_base_uri') do
51
37
  it('defaults to nil') do
52
38
  expect(JsonModel.config.schema_id_base_uri)