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.
- checksums.yaml +7 -0
- data/README.md +239 -0
- data/lib/igniter/contracts/api.rb +92 -0
- data/lib/igniter/contracts/assembly/baseline_pack.rb +141 -0
- data/lib/igniter/contracts/assembly/const_pack.rb +29 -0
- data/lib/igniter/contracts/assembly/dsl_keyword.rb +21 -0
- data/lib/igniter/contracts/assembly/hook_result_policies.rb +47 -0
- data/lib/igniter/contracts/assembly/hook_spec.rb +73 -0
- data/lib/igniter/contracts/assembly/hook_specs.rb +74 -0
- data/lib/igniter/contracts/assembly/kernel.rb +220 -0
- data/lib/igniter/contracts/assembly/node_type.rb +26 -0
- data/lib/igniter/contracts/assembly/ordered_registry.rb +55 -0
- data/lib/igniter/contracts/assembly/pack.rb +13 -0
- data/lib/igniter/contracts/assembly/pack_manifest.rb +131 -0
- data/lib/igniter/contracts/assembly/path_access.rb +76 -0
- data/lib/igniter/contracts/assembly/profile.rb +133 -0
- data/lib/igniter/contracts/assembly/project_pack.rb +42 -0
- data/lib/igniter/contracts/assembly/registry.rb +57 -0
- data/lib/igniter/contracts/assembly/step_result_pack.rb +42 -0
- data/lib/igniter/contracts/assembly.rb +18 -0
- data/lib/igniter/contracts/contract.rb +135 -0
- data/lib/igniter/contracts/contractable.rb +288 -0
- data/lib/igniter/contracts/environment.rb +51 -0
- data/lib/igniter/contracts/errors.rb +47 -0
- data/lib/igniter/contracts/execution/baseline_normalizers.rb +23 -0
- data/lib/igniter/contracts/execution/baseline_runtime.rb +55 -0
- data/lib/igniter/contracts/execution/baseline_validators.rb +113 -0
- data/lib/igniter/contracts/execution/builder.rb +43 -0
- data/lib/igniter/contracts/execution/compilation_report.rb +46 -0
- data/lib/igniter/contracts/execution/compiled_graph.rb +21 -0
- data/lib/igniter/contracts/execution/compiler.rb +66 -0
- data/lib/igniter/contracts/execution/const_runtime.rb +15 -0
- data/lib/igniter/contracts/execution/diagnostics.rb +24 -0
- data/lib/igniter/contracts/execution/diagnostics_report.rb +40 -0
- data/lib/igniter/contracts/execution/diagnostics_section.rb +37 -0
- data/lib/igniter/contracts/execution/effect_invocation.rb +26 -0
- data/lib/igniter/contracts/execution/execution_request.rb +28 -0
- data/lib/igniter/contracts/execution/execution_result.rb +32 -0
- data/lib/igniter/contracts/execution/inline_executor.rb +19 -0
- data/lib/igniter/contracts/execution/mutable_named_values.rb +52 -0
- data/lib/igniter/contracts/execution/named_values.rb +48 -0
- data/lib/igniter/contracts/execution/operation.rb +42 -0
- data/lib/igniter/contracts/execution/runtime.rb +43 -0
- data/lib/igniter/contracts/execution/step_result.rb +51 -0
- data/lib/igniter/contracts/execution/step_result_diagnostics.rb +35 -0
- data/lib/igniter/contracts/execution/step_result_runtime.rb +51 -0
- data/lib/igniter/contracts/execution/step_result_validators.rb +44 -0
- data/lib/igniter/contracts/execution/structured_dump.rb +49 -0
- data/lib/igniter/contracts/execution/validation_finding.rb +28 -0
- data/lib/igniter/contracts/execution/validation_report.rb +46 -0
- data/lib/igniter/contracts/execution.rb +28 -0
- data/lib/igniter/contracts.rb +54 -0
- data/lib/igniter/lang/backend.rb +19 -0
- data/lib/igniter/lang/backends/ruby.rb +42 -0
- data/lib/igniter/lang/diagnostic_payload.rb +174 -0
- data/lib/igniter/lang/metadata_carrier_manifest.rb +112 -0
- data/lib/igniter/lang/metadata_manifest.rb +128 -0
- data/lib/igniter/lang/receipt_payload.rb +152 -0
- data/lib/igniter/lang/schema_compatibility_diagnostic.rb +300 -0
- data/lib/igniter/lang/types.rb +84 -0
- data/lib/igniter/lang/verification_report.rb +226 -0
- data/lib/igniter/lang.rb +27 -0
- data/lib/igniter-contracts.rb +3 -0
- 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
|
data/lib/igniter/lang.rb
ADDED
|
@@ -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
|
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: []
|