dry-validation-rust 0.1.0.pre5-aarch64-linux

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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +74 -0
  3. data/LICENSE +21 -0
  4. data/NOTICE.md +28 -0
  5. data/README.md +459 -0
  6. data/docs/ARCHITECTURE.md +256 -0
  7. data/docs/COMPATIBILITY.md +198 -0
  8. data/docs/FEASIBILITY.md +207 -0
  9. data/docs/SUPPORT_MATRIX.md +66 -0
  10. data/docs/VERIFICATION.md +128 -0
  11. data/dry-validation-rust.gemspec +58 -0
  12. data/lib/dry/schema.rb +6 -0
  13. data/lib/dry/validation/rust/block_keyword_parameters.rb +20 -0
  14. data/lib/dry/validation/rust/config.rb +74 -0
  15. data/lib/dry/validation/rust/contract/result.rb +180 -0
  16. data/lib/dry/validation/rust/contract/values.rb +73 -0
  17. data/lib/dry/validation/rust/contract.rb +400 -0
  18. data/lib/dry/validation/rust/errors.rb +14 -0
  19. data/lib/dry/validation/rust/evaluator.rb +295 -0
  20. data/lib/dry/validation/rust/failures.rb +57 -0
  21. data/lib/dry/validation/rust/generated_predicates.rb +14 -0
  22. data/lib/dry/validation/rust/macros.rb +45 -0
  23. data/lib/dry/validation/rust/message.rb +41 -0
  24. data/lib/dry/validation/rust/message_backend.rb +115 -0
  25. data/lib/dry/validation/rust/message_set.rb +159 -0
  26. data/lib/dry/validation/rust/native.rb +25 -0
  27. data/lib/dry/validation/rust/native.so +0 -0
  28. data/lib/dry/validation/rust/path.rb +65 -0
  29. data/lib/dry/validation/rust/path_trie.rb +57 -0
  30. data/lib/dry/validation/rust/result.rb +3 -0
  31. data/lib/dry/validation/rust/rule.rb +62 -0
  32. data/lib/dry/validation/rust/schema/dsl.rb +76 -0
  33. data/lib/dry/validation/rust/schema/field_builder.rb +156 -0
  34. data/lib/dry/validation/rust/schema/field_definition.rb +99 -0
  35. data/lib/dry/validation/rust/schema/predicate_block.rb +56 -0
  36. data/lib/dry/validation/rust/schema/processor_hooks.rb +46 -0
  37. data/lib/dry/validation/rust/schema/result.rb +67 -0
  38. data/lib/dry/validation/rust/schema/ruby_type_processor.rb +44 -0
  39. data/lib/dry/validation/rust/schema.rb +323 -0
  40. data/lib/dry/validation/rust/values.rb +3 -0
  41. data/lib/dry/validation/rust/version.rb +10 -0
  42. data/lib/dry/validation/rust.rb +55 -0
  43. data/lib/dry/validation.rb +66 -0
  44. data/lib/dry-schema.rb +3 -0
  45. data/lib/dry-validation.rb +3 -0
  46. data/lib/dry_validation_rust.rb +3 -0
  47. data/predicates.yml +67 -0
  48. data/rust-toolchain.toml +9 -0
  49. metadata +233 -0
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'rust/version'
4
+ require_relative 'rust/errors'
5
+ require_relative 'rust/native'
6
+ require_relative 'rust/path'
7
+ require_relative 'rust/path_trie'
8
+ require_relative 'rust/message'
9
+ require_relative 'rust/message_set'
10
+ require_relative 'rust/contract/values'
11
+ require_relative 'rust/macros'
12
+ require_relative 'rust/failures'
13
+ require_relative 'rust/message_backend'
14
+ require_relative 'rust/config'
15
+ require_relative 'rust/schema'
16
+ require_relative 'rust/rule'
17
+ require_relative 'rust/evaluator'
18
+ require_relative 'rust/contract/result'
19
+ require_relative 'rust/contract'
20
+
21
+ module Dry
22
+ module Validation
23
+ module Rust
24
+ class << self
25
+ # @api private
26
+ def global_macros
27
+ @global_macros ||= MacroRegistry.new
28
+ end
29
+
30
+ def register_macro(name, *, &)
31
+ global_macros.register(name, *, &)
32
+ self
33
+ end
34
+
35
+ def Contract(options = {}, &)
36
+ Contract.build(options, &)
37
+ end
38
+
39
+ def load_extensions(*names)
40
+ names.each do |name|
41
+ next if name.to_sym == :predicates_as_macros
42
+
43
+ raise UnsupportedFeatureError,
44
+ "extension #{name.inspect} is not implemented in the experimental Rust compatibility layer"
45
+ end
46
+ self
47
+ end
48
+ end
49
+
50
+ register_macro(:acceptance) do
51
+ key.failure(:acceptance) unless value.equal?(true)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'validation/rust'
4
+
5
+ module Dry
6
+ if const_defined?(:Schema, false) &&
7
+ !const_get(:Schema, false).const_defined?(:RUST_COMPATIBILITY_LAYER, false)
8
+ raise LoadError, <<~MESSAGE
9
+ dry-schema and dry-validation-rust cannot both own Dry::Schema in exact compatibility mode.
10
+ Remove the upstream dry-schema/dry-validation gems, or use the side-by-side
11
+ dry/validation/rust namespace.
12
+ MESSAGE
13
+ end
14
+
15
+ unless const_defined?(:Schema, false)
16
+ module Schema
17
+ RUST_COMPATIBILITY_LAYER = true
18
+ VERSION = Validation::Rust::VERSION
19
+
20
+ class << self
21
+ def Params(*external_schemas, &)
22
+ Validation::Rust::Schema.Params(*external_schemas, &)
23
+ end
24
+
25
+ def JSON(*external_schemas, &)
26
+ Validation::Rust::Schema.JSON(*external_schemas, &)
27
+ end
28
+
29
+ def define(*external_schemas, &)
30
+ Validation::Rust::Schema.define(:schema, *external_schemas, &)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ module Validation
37
+ if const_defined?(:Contract, false) && const_get(:Contract, false) != Rust::Contract
38
+ raise LoadError, <<~MESSAGE
39
+ dry-validation and dry-validation-rust cannot both own Dry::Validation::Contract.
40
+ Remove the upstream dry-validation gem when using exact compatibility mode, or
41
+ require "dry/validation/rust" and inherit from Dry::Validation::Rust::Contract.
42
+ MESSAGE
43
+ end
44
+
45
+ Contract = Rust::Contract unless const_defined?(:Contract, false)
46
+ Result = Rust::Contract::Result unless const_defined?(:Result, false)
47
+ Message = Rust::Message unless const_defined?(:Message, false)
48
+ MessageSet = Rust::MessageSet unless const_defined?(:MessageSet, false)
49
+ Evaluator = Rust::Evaluator unless const_defined?(:Evaluator, false)
50
+ VERSION = Rust::VERSION unless const_defined?(:VERSION, false)
51
+
52
+ class << self
53
+ def Contract(options = {}, &)
54
+ Rust.Contract(options, &)
55
+ end
56
+
57
+ def register_macro(name, *, &)
58
+ Rust.register_macro(name, *, &)
59
+ end
60
+
61
+ def load_extensions(*names)
62
+ Rust.load_extensions(*names)
63
+ end
64
+ end
65
+ end
66
+ end
data/lib/dry-schema.rb ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/schema'
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/validation'
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/validation/rust'
data/predicates.yml ADDED
@@ -0,0 +1,67 @@
1
+ # The authoritative ownership and native-plan mapping for supported predicates.
2
+ predicates:
3
+ - name: gt
4
+ owner: rust
5
+ ruby_method: ">"
6
+ rust_op: Gt
7
+ supported_types: [integer, float, decimal]
8
+ - name: gteq
9
+ owner: rust
10
+ ruby_method: ">="
11
+ rust_op: Gteq
12
+ supported_types: [integer, float, decimal]
13
+ - name: lt
14
+ owner: rust
15
+ ruby_method: "<"
16
+ rust_op: Lt
17
+ supported_types: [integer, float, decimal]
18
+ - name: lteq
19
+ owner: rust
20
+ ruby_method: "<="
21
+ rust_op: Lteq
22
+ supported_types: [integer, float, decimal]
23
+ - name: min_size
24
+ owner: rust
25
+ ruby_method: ">="
26
+ rust_op: MinSize
27
+ supported_types: [string, array, hash]
28
+ - name: max_size
29
+ owner: rust
30
+ ruby_method: "<="
31
+ rust_op: MaxSize
32
+ supported_types: [string, array, hash]
33
+ - name: size
34
+ owner: rust
35
+ ruby_method: "=="
36
+ rust_op: Size
37
+ supported_types: [string, array, hash]
38
+ - name: odd
39
+ owner: rust
40
+ ruby_method: odd?
41
+ rust_op: Odd
42
+ supported_types: [integer]
43
+ - name: even
44
+ owner: rust
45
+ ruby_method: even?
46
+ rust_op: Even
47
+ supported_types: [integer]
48
+ - name: format
49
+ owner: ruby
50
+ ruby_method: match?
51
+ supported_types: [string]
52
+ - name: included_in
53
+ owner: ruby
54
+ ruby_method: include?
55
+ supported_types: [any]
56
+ - name: excluded_from
57
+ owner: ruby
58
+ ruby_method: exclude?
59
+ supported_types: [any]
60
+ - name: eql
61
+ owner: ruby
62
+ ruby_method: eql?
63
+ supported_types: [any]
64
+ - name: not_eql
65
+ owner: ruby
66
+ ruby_method: "!="
67
+ supported_types: [any]
@@ -0,0 +1,9 @@
1
+ [toolchain]
2
+ channel = "1.75.0"
3
+ profile = "minimal"
4
+ targets = [
5
+ "aarch64-unknown-linux-gnu",
6
+ "x86_64-apple-darwin",
7
+ "aarch64-apple-darwin"
8
+ ]
9
+ components = [ "rust-analyzer" ]
metadata ADDED
@@ -0,0 +1,233 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dry-validation-rust
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre5
5
+ platform: aarch64-linux
6
+ authors:
7
+ - Alexey Tomilov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-08-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bigdecimal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: memory_profiler
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.1'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: minitest
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '6.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '6.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: mutex_m
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.2'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.2'
75
+ - !ruby/object:Gem::Dependency
76
+ name: ostruct
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.6'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.6'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rake
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '13.1'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '13.1'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake-compiler
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.3'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rake-compiler-dock
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.12'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.12'
131
+ - !ruby/object:Gem::Dependency
132
+ name: yard
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.9'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.9'
145
+ description: |
146
+ A hybrid Ruby/Rust validation gem that compiles a documented subset of
147
+ dry-validation's declarative schema DSL into a native Rust execution plan
148
+ while retaining Ruby rule blocks and Ruby-owned dynamic behavior.
149
+ email:
150
+ executables: []
151
+ extensions: []
152
+ extra_rdoc_files: []
153
+ files:
154
+ - CHANGELOG.md
155
+ - LICENSE
156
+ - NOTICE.md
157
+ - README.md
158
+ - docs/ARCHITECTURE.md
159
+ - docs/COMPATIBILITY.md
160
+ - docs/FEASIBILITY.md
161
+ - docs/SUPPORT_MATRIX.md
162
+ - docs/VERIFICATION.md
163
+ - dry-validation-rust.gemspec
164
+ - lib/dry-schema.rb
165
+ - lib/dry-validation.rb
166
+ - lib/dry/schema.rb
167
+ - lib/dry/validation.rb
168
+ - lib/dry/validation/rust.rb
169
+ - lib/dry/validation/rust/block_keyword_parameters.rb
170
+ - lib/dry/validation/rust/config.rb
171
+ - lib/dry/validation/rust/contract.rb
172
+ - lib/dry/validation/rust/contract/result.rb
173
+ - lib/dry/validation/rust/contract/values.rb
174
+ - lib/dry/validation/rust/errors.rb
175
+ - lib/dry/validation/rust/evaluator.rb
176
+ - lib/dry/validation/rust/failures.rb
177
+ - lib/dry/validation/rust/generated_predicates.rb
178
+ - lib/dry/validation/rust/macros.rb
179
+ - lib/dry/validation/rust/message.rb
180
+ - lib/dry/validation/rust/message_backend.rb
181
+ - lib/dry/validation/rust/message_set.rb
182
+ - lib/dry/validation/rust/native.rb
183
+ - lib/dry/validation/rust/native.so
184
+ - lib/dry/validation/rust/path.rb
185
+ - lib/dry/validation/rust/path_trie.rb
186
+ - lib/dry/validation/rust/result.rb
187
+ - lib/dry/validation/rust/rule.rb
188
+ - lib/dry/validation/rust/schema.rb
189
+ - lib/dry/validation/rust/schema/dsl.rb
190
+ - lib/dry/validation/rust/schema/field_builder.rb
191
+ - lib/dry/validation/rust/schema/field_definition.rb
192
+ - lib/dry/validation/rust/schema/predicate_block.rb
193
+ - lib/dry/validation/rust/schema/processor_hooks.rb
194
+ - lib/dry/validation/rust/schema/result.rb
195
+ - lib/dry/validation/rust/schema/ruby_type_processor.rb
196
+ - lib/dry/validation/rust/values.rb
197
+ - lib/dry/validation/rust/version.rb
198
+ - lib/dry_validation_rust.rb
199
+ - predicates.yml
200
+ - rust-toolchain.toml
201
+ homepage: https://github.com/alex-tomilov/dry-validation-rust
202
+ licenses:
203
+ - MIT
204
+ metadata:
205
+ rubygems_mfa_required: 'true'
206
+ source_code_uri: https://github.com/alex-tomilov/dry-validation-rust
207
+ changelog_uri: https://github.com/alex-tomilov/dry-validation-rust/blob/main/CHANGELOG.md
208
+ documentation_uri: https://github.com/alex-tomilov/dry-validation-rust/blob/main/README.md
209
+ bug_tracker_uri: https://github.com/alex-tomilov/dry-validation-rust/issues
210
+ post_install_message:
211
+ rdoc_options: []
212
+ require_paths:
213
+ - lib
214
+ required_ruby_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '3.3'
219
+ - - "<"
220
+ - !ruby/object:Gem::Version
221
+ version: 3.4.dev
222
+ required_rubygems_version: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - ">="
225
+ - !ruby/object:Gem::Version
226
+ version: '0'
227
+ requirements: []
228
+ rubygems_version: 3.5.23
229
+ signing_key:
230
+ specification_version: 4
231
+ summary: Experimental Rust-backed validation contracts with a dry-validation-like
232
+ API
233
+ test_files: []