igniter-contracts 0.5.2

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 (64) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +239 -0
  3. data/lib/igniter/contracts/api.rb +92 -0
  4. data/lib/igniter/contracts/assembly/baseline_pack.rb +141 -0
  5. data/lib/igniter/contracts/assembly/const_pack.rb +29 -0
  6. data/lib/igniter/contracts/assembly/dsl_keyword.rb +21 -0
  7. data/lib/igniter/contracts/assembly/hook_result_policies.rb +47 -0
  8. data/lib/igniter/contracts/assembly/hook_spec.rb +73 -0
  9. data/lib/igniter/contracts/assembly/hook_specs.rb +74 -0
  10. data/lib/igniter/contracts/assembly/kernel.rb +220 -0
  11. data/lib/igniter/contracts/assembly/node_type.rb +26 -0
  12. data/lib/igniter/contracts/assembly/ordered_registry.rb +55 -0
  13. data/lib/igniter/contracts/assembly/pack.rb +13 -0
  14. data/lib/igniter/contracts/assembly/pack_manifest.rb +131 -0
  15. data/lib/igniter/contracts/assembly/path_access.rb +76 -0
  16. data/lib/igniter/contracts/assembly/profile.rb +133 -0
  17. data/lib/igniter/contracts/assembly/project_pack.rb +42 -0
  18. data/lib/igniter/contracts/assembly/registry.rb +57 -0
  19. data/lib/igniter/contracts/assembly/step_result_pack.rb +42 -0
  20. data/lib/igniter/contracts/assembly.rb +18 -0
  21. data/lib/igniter/contracts/contract.rb +135 -0
  22. data/lib/igniter/contracts/contractable.rb +288 -0
  23. data/lib/igniter/contracts/environment.rb +51 -0
  24. data/lib/igniter/contracts/errors.rb +47 -0
  25. data/lib/igniter/contracts/execution/baseline_normalizers.rb +23 -0
  26. data/lib/igniter/contracts/execution/baseline_runtime.rb +55 -0
  27. data/lib/igniter/contracts/execution/baseline_validators.rb +113 -0
  28. data/lib/igniter/contracts/execution/builder.rb +43 -0
  29. data/lib/igniter/contracts/execution/compilation_report.rb +46 -0
  30. data/lib/igniter/contracts/execution/compiled_graph.rb +21 -0
  31. data/lib/igniter/contracts/execution/compiler.rb +66 -0
  32. data/lib/igniter/contracts/execution/const_runtime.rb +15 -0
  33. data/lib/igniter/contracts/execution/diagnostics.rb +24 -0
  34. data/lib/igniter/contracts/execution/diagnostics_report.rb +40 -0
  35. data/lib/igniter/contracts/execution/diagnostics_section.rb +37 -0
  36. data/lib/igniter/contracts/execution/effect_invocation.rb +26 -0
  37. data/lib/igniter/contracts/execution/execution_request.rb +28 -0
  38. data/lib/igniter/contracts/execution/execution_result.rb +32 -0
  39. data/lib/igniter/contracts/execution/inline_executor.rb +19 -0
  40. data/lib/igniter/contracts/execution/mutable_named_values.rb +52 -0
  41. data/lib/igniter/contracts/execution/named_values.rb +48 -0
  42. data/lib/igniter/contracts/execution/operation.rb +42 -0
  43. data/lib/igniter/contracts/execution/runtime.rb +43 -0
  44. data/lib/igniter/contracts/execution/step_result.rb +51 -0
  45. data/lib/igniter/contracts/execution/step_result_diagnostics.rb +35 -0
  46. data/lib/igniter/contracts/execution/step_result_runtime.rb +51 -0
  47. data/lib/igniter/contracts/execution/step_result_validators.rb +44 -0
  48. data/lib/igniter/contracts/execution/structured_dump.rb +49 -0
  49. data/lib/igniter/contracts/execution/validation_finding.rb +28 -0
  50. data/lib/igniter/contracts/execution/validation_report.rb +46 -0
  51. data/lib/igniter/contracts/execution.rb +28 -0
  52. data/lib/igniter/contracts.rb +54 -0
  53. data/lib/igniter/lang/backend.rb +19 -0
  54. data/lib/igniter/lang/backends/ruby.rb +42 -0
  55. data/lib/igniter/lang/diagnostic_payload.rb +174 -0
  56. data/lib/igniter/lang/metadata_carrier_manifest.rb +112 -0
  57. data/lib/igniter/lang/metadata_manifest.rb +128 -0
  58. data/lib/igniter/lang/receipt_payload.rb +152 -0
  59. data/lib/igniter/lang/schema_compatibility_diagnostic.rb +300 -0
  60. data/lib/igniter/lang/types.rb +84 -0
  61. data/lib/igniter/lang/verification_report.rb +226 -0
  62. data/lib/igniter/lang.rb +27 -0
  63. data/lib/igniter-contracts.rb +3 -0
  64. metadata +103 -0
@@ -0,0 +1,226 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Igniter
4
+ module Lang
5
+ class VerificationReport
6
+ METADATA_CARRIER_SECTIONS = %i[
7
+ diagnostics
8
+ receipts
9
+ model_validity_reports
10
+ scenario_comparison_reports
11
+ review_receipts
12
+ ].freeze
13
+ CUSTOM_METADATA_CARRIER_SECTIONS_KEY = :custom_sections
14
+
15
+ METADATA_CARRIER_SEMANTICS = {
16
+ report_only: true,
17
+ runtime_enforced: false,
18
+ execution_authorized: false,
19
+ provider_call_authorized: false,
20
+ real_data_export_authorized: false,
21
+ readiness_enforced: false,
22
+ ledger_core: false
23
+ }.freeze
24
+
25
+ DEFAULT_METADATA_REDACTION_POLICY = {
26
+ raw_ref_export: false,
27
+ hash_source_refs: true,
28
+ redacted_ref_kinds: []
29
+ }.freeze
30
+
31
+ RAW_REF_KEYS = %i[raw_ref raw_refs raw_source_ref raw_source_refs].freeze
32
+ RAW_REF_PREFIX = "raw:"
33
+
34
+ attr_reader :profile_fingerprint,
35
+ :operations,
36
+ :findings,
37
+ :descriptors,
38
+ :metadata,
39
+ :metadata_manifest,
40
+ :carrier_manifest,
41
+ :diagnostic_payloads,
42
+ :receipt_payloads,
43
+ :schema_compatibility_diagnostics
44
+
45
+ def self.from_compilation_report(report)
46
+ new(
47
+ profile_fingerprint: report.profile_fingerprint,
48
+ operations: report.operations,
49
+ findings: report.findings.map(&:to_h),
50
+ metadata: { source: :compilation_report }
51
+ )
52
+ end
53
+
54
+ def self.from_artifact(artifact, profile_fingerprint:)
55
+ operations = artifact ? artifact.operations : []
56
+ new(
57
+ profile_fingerprint: profile_fingerprint,
58
+ operations: operations,
59
+ findings: [],
60
+ metadata: { source: :compiled_artifact }
61
+ )
62
+ end
63
+
64
+ def initialize(
65
+ profile_fingerprint:,
66
+ operations:,
67
+ findings: [],
68
+ metadata: {},
69
+ diagnostic_payloads: [],
70
+ receipt_payloads: [],
71
+ schema_compatibility_diagnostics: []
72
+ )
73
+ @profile_fingerprint = profile_fingerprint
74
+ @operations = operations.freeze
75
+ @findings = findings.freeze
76
+ @metadata = normalize_metadata(metadata)
77
+ @metadata_manifest = MetadataManifest.from_operations(operations)
78
+ @carrier_manifest = MetadataCarrierManifest.from_metadata(@metadata)
79
+ @descriptors = metadata_manifest.descriptors
80
+ @diagnostic_payloads = normalize_diagnostic_payloads(diagnostic_payloads)
81
+ @receipt_payloads = normalize_receipt_payloads(receipt_payloads)
82
+ @schema_compatibility_diagnostics = normalize_schema_compatibility_diagnostics(
83
+ schema_compatibility_diagnostics
84
+ )
85
+ freeze
86
+ end
87
+
88
+ def ok?
89
+ findings.empty?
90
+ end
91
+
92
+ def invalid?
93
+ !ok?
94
+ end
95
+
96
+ def to_h
97
+ {
98
+ ok: ok?,
99
+ profile_fingerprint: profile_fingerprint,
100
+ descriptors: descriptors,
101
+ metadata_manifest: metadata_manifest.to_h,
102
+ carrier_manifest: carrier_manifest.to_h,
103
+ diagnostic_payloads: diagnostic_payloads.map(&:to_h),
104
+ receipt_payloads: receipt_payloads.map(&:to_h),
105
+ schema_compatibility_diagnostics: schema_compatibility_diagnostics.map(&:to_h),
106
+ findings: findings,
107
+ metadata: metadata
108
+ }
109
+ end
110
+
111
+ private
112
+
113
+ def normalize_metadata(value)
114
+ metadata_hash = normalize_hash(value, :metadata)
115
+ return deep_freeze(metadata_hash) unless metadata_carrier?(metadata_hash)
116
+
117
+ raise ArgumentError, "metadata.redaction_policy is required for carrier sections" unless metadata_hash.key?(:redaction_policy)
118
+
119
+ metadata_hash[:redaction_policy] = normalize_metadata_redaction_policy(metadata_hash[:redaction_policy])
120
+ metadata_hash[:semantics] = normalize_metadata_semantics(metadata_hash[:semantics] || {})
121
+ reject_metadata_raw_refs!(metadata_hash)
122
+ deep_freeze(metadata_hash)
123
+ end
124
+
125
+ def metadata_carrier?(metadata_hash)
126
+ METADATA_CARRIER_SECTIONS.any? { |section| metadata_hash.key?(section) } ||
127
+ metadata_hash.key?(CUSTOM_METADATA_CARRIER_SECTIONS_KEY)
128
+ end
129
+
130
+ def normalize_metadata_redaction_policy(value)
131
+ policy = DEFAULT_METADATA_REDACTION_POLICY.merge(normalize_hash(value, :redaction_policy))
132
+ raise ArgumentError, "metadata.redaction_policy.raw_ref_export must be true or false" unless [true, false].include?(policy[:raw_ref_export])
133
+ raise ArgumentError, "metadata.redaction_policy.raw_ref_export true is not supported in v0" if policy[:raw_ref_export]
134
+
135
+ policy[:redacted_ref_kinds] = Array(policy[:redacted_ref_kinds]).map(&:to_s)
136
+ policy
137
+ end
138
+
139
+ def normalize_metadata_semantics(value)
140
+ normalize_hash(value, :semantics).merge(METADATA_CARRIER_SEMANTICS)
141
+ end
142
+
143
+ def reject_metadata_raw_refs!(metadata_hash)
144
+ raw_path = find_raw_ref(metadata_hash)
145
+ raise ArgumentError, "raw refs are not allowed in verification metadata at metadata.#{raw_path}" if raw_path
146
+ end
147
+
148
+ def normalize_diagnostic_payloads(entries)
149
+ entries.map do |entry|
150
+ next entry if entry.is_a?(DiagnosticPayload)
151
+
152
+ DiagnosticPayload.new(**entry.to_h.transform_keys(&:to_sym))
153
+ end.freeze
154
+ end
155
+
156
+ def normalize_receipt_payloads(entries)
157
+ entries.map do |entry|
158
+ next entry if entry.is_a?(ReceiptPayload)
159
+
160
+ ReceiptPayload.new(**entry.to_h.transform_keys(&:to_sym))
161
+ end.freeze
162
+ end
163
+
164
+ def normalize_schema_compatibility_diagnostics(entries)
165
+ entries.map do |entry|
166
+ next entry if entry.is_a?(SchemaCompatibilityDiagnostic)
167
+
168
+ SchemaCompatibilityDiagnostic.new(**entry.to_h.transform_keys(&:to_sym))
169
+ end.freeze
170
+ end
171
+
172
+ def find_raw_ref(value, path = [])
173
+ case value
174
+ when Hash
175
+ value.each do |key, entry|
176
+ normalized_key = key.respond_to?(:to_sym) ? key.to_sym : key
177
+ return (path + [normalized_key]).join(".") if RAW_REF_KEYS.include?(normalized_key)
178
+
179
+ nested = find_raw_ref(entry, path + [normalized_key])
180
+ return nested if nested
181
+ end
182
+ when Array
183
+ value.each_with_index do |entry, index|
184
+ nested = find_raw_ref(entry, path + [index])
185
+ return nested if nested
186
+ end
187
+ when String
188
+ return path.join(".") if value.start_with?(RAW_REF_PREFIX)
189
+ end
190
+
191
+ nil
192
+ end
193
+
194
+ def normalize_hash(value, name)
195
+ raise ArgumentError, "#{name} must be a hash" unless value.respond_to?(:to_h)
196
+
197
+ value.to_h.each_with_object({}) do |(key, entry), hash|
198
+ normalized_key = key.respond_to?(:to_sym) ? key.to_sym : key
199
+ hash[normalized_key] = normalize_value(entry)
200
+ end
201
+ end
202
+
203
+ def normalize_value(value)
204
+ case value
205
+ when Hash
206
+ normalize_hash(value, :value)
207
+ when Array
208
+ value.map { |entry| normalize_value(entry) }
209
+ else
210
+ value
211
+ end
212
+ end
213
+
214
+ def deep_freeze(value)
215
+ case value
216
+ when Array
217
+ value.map { |entry| deep_freeze(entry) }.freeze
218
+ when Hash
219
+ value.transform_values { |entry| deep_freeze(entry) }.freeze
220
+ else
221
+ value.freeze
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "contracts"
4
+ require_relative "lang/types"
5
+ require_relative "lang/metadata_manifest"
6
+ require_relative "lang/metadata_carrier_manifest"
7
+ require_relative "lang/diagnostic_payload"
8
+ require_relative "lang/receipt_payload"
9
+ require_relative "lang/schema_compatibility_diagnostic"
10
+ require_relative "lang/verification_report"
11
+ require_relative "lang/backend"
12
+ require_relative "lang/backends/ruby"
13
+
14
+ module Igniter
15
+ module Lang
16
+ History = Types::History
17
+ BiHistory = Types::BiHistory
18
+ OLAPPoint = Types::OLAPPoint
19
+ Forecast = Types::Forecast
20
+
21
+ class << self
22
+ def ruby_backend(profile: Igniter::Contracts.default_profile)
23
+ Backends::Ruby.new(profile: profile)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "igniter/contracts"
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: igniter-contracts
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ platform: ruby
6
+ authors:
7
+ - Alexander
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: Public embedded package for Igniter contracts, graph compilation, execution,
13
+ diagnostics, and core runtime seams.
14
+ email:
15
+ - alexander.s.fokin@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - README.md
21
+ - lib/igniter-contracts.rb
22
+ - lib/igniter/contracts.rb
23
+ - lib/igniter/contracts/api.rb
24
+ - lib/igniter/contracts/assembly.rb
25
+ - lib/igniter/contracts/assembly/baseline_pack.rb
26
+ - lib/igniter/contracts/assembly/const_pack.rb
27
+ - lib/igniter/contracts/assembly/dsl_keyword.rb
28
+ - lib/igniter/contracts/assembly/hook_result_policies.rb
29
+ - lib/igniter/contracts/assembly/hook_spec.rb
30
+ - lib/igniter/contracts/assembly/hook_specs.rb
31
+ - lib/igniter/contracts/assembly/kernel.rb
32
+ - lib/igniter/contracts/assembly/node_type.rb
33
+ - lib/igniter/contracts/assembly/ordered_registry.rb
34
+ - lib/igniter/contracts/assembly/pack.rb
35
+ - lib/igniter/contracts/assembly/pack_manifest.rb
36
+ - lib/igniter/contracts/assembly/path_access.rb
37
+ - lib/igniter/contracts/assembly/profile.rb
38
+ - lib/igniter/contracts/assembly/project_pack.rb
39
+ - lib/igniter/contracts/assembly/registry.rb
40
+ - lib/igniter/contracts/assembly/step_result_pack.rb
41
+ - lib/igniter/contracts/contract.rb
42
+ - lib/igniter/contracts/contractable.rb
43
+ - lib/igniter/contracts/environment.rb
44
+ - lib/igniter/contracts/errors.rb
45
+ - lib/igniter/contracts/execution.rb
46
+ - lib/igniter/contracts/execution/baseline_normalizers.rb
47
+ - lib/igniter/contracts/execution/baseline_runtime.rb
48
+ - lib/igniter/contracts/execution/baseline_validators.rb
49
+ - lib/igniter/contracts/execution/builder.rb
50
+ - lib/igniter/contracts/execution/compilation_report.rb
51
+ - lib/igniter/contracts/execution/compiled_graph.rb
52
+ - lib/igniter/contracts/execution/compiler.rb
53
+ - lib/igniter/contracts/execution/const_runtime.rb
54
+ - lib/igniter/contracts/execution/diagnostics.rb
55
+ - lib/igniter/contracts/execution/diagnostics_report.rb
56
+ - lib/igniter/contracts/execution/diagnostics_section.rb
57
+ - lib/igniter/contracts/execution/effect_invocation.rb
58
+ - lib/igniter/contracts/execution/execution_request.rb
59
+ - lib/igniter/contracts/execution/execution_result.rb
60
+ - lib/igniter/contracts/execution/inline_executor.rb
61
+ - lib/igniter/contracts/execution/mutable_named_values.rb
62
+ - lib/igniter/contracts/execution/named_values.rb
63
+ - lib/igniter/contracts/execution/operation.rb
64
+ - lib/igniter/contracts/execution/runtime.rb
65
+ - lib/igniter/contracts/execution/step_result.rb
66
+ - lib/igniter/contracts/execution/step_result_diagnostics.rb
67
+ - lib/igniter/contracts/execution/step_result_runtime.rb
68
+ - lib/igniter/contracts/execution/step_result_validators.rb
69
+ - lib/igniter/contracts/execution/structured_dump.rb
70
+ - lib/igniter/contracts/execution/validation_finding.rb
71
+ - lib/igniter/contracts/execution/validation_report.rb
72
+ - lib/igniter/lang.rb
73
+ - lib/igniter/lang/backend.rb
74
+ - lib/igniter/lang/backends/ruby.rb
75
+ - lib/igniter/lang/diagnostic_payload.rb
76
+ - lib/igniter/lang/metadata_carrier_manifest.rb
77
+ - lib/igniter/lang/metadata_manifest.rb
78
+ - lib/igniter/lang/receipt_payload.rb
79
+ - lib/igniter/lang/schema_compatibility_diagnostic.rb
80
+ - lib/igniter/lang/types.rb
81
+ - lib/igniter/lang/verification_report.rb
82
+ homepage: https://github.com/alexander-s-f/igniter
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: 3.1.0
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubygems_version: 4.0.10
101
+ specification_version: 4
102
+ summary: Embedded contracts kernel for Igniter
103
+ test_files: []