statelint 0.1.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6bee89be701a12fd45bd3d6b0de5b505aad1c602
4
- data.tar.gz: 6b6f4208af22128dd92b36c9a81b7def5146e111
2
+ SHA256:
3
+ metadata.gz: 0f7cf7b9cd3f0f19021f4bb2fb8657b1f282f5dd014914b0ecee706a1f89abdd
4
+ data.tar.gz: 11cd1013ed9799022e84986f740d53cc04ebb64dd26555f7131922fb8c862f4d
5
5
  SHA512:
6
- metadata.gz: eb442240dd8d5a919fecc74eed803bda47052b4ddad5ad7b1a9a0d6de092dd9625d809a0124801fe09a28d26df95437d1abbe5b344d10ddaa1a485f5de56f400
7
- data.tar.gz: d7bf9684350829a5dae1e5b732bb6268fda45f4921f3626309b3d1cb5ff4342e7b5c27be7dc024a52701065eac9e6cb0ac2bd63c833270738c2df79adfd019ec
6
+ metadata.gz: cae59e2cd4ac26483138e8f1ae50c74cb09f93f5bb76dab010db0748ae0bde3d86e19679e081ba8d3ae8a2193d9428f755b1882a928d45550ea66201e793978a
7
+ data.tar.gz: b325d6cafdbc3ce69ebcfca460a2d8c8eaad5bef6f5fcaad36b90cf49ec79f5381e02d9280ccd4b982b3451c4bf9a639472abeb87c30127cc43a5d38f661e1fe
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem 'j2119', '>=0.1.0'
3
+ gem 'j2119', '>=0.4.0'
4
+ gem 'rake', '>=12.3.2'
5
+ gem 'rspec', '>=3.8.0'
@@ -4,7 +4,7 @@ A State Machine MUST have a string field named "StartAt".
4
4
  A State Machine MAY have a string field named "Comment".
5
5
  A State Machine MAY have a string field named "Version".
6
6
  A State Machine MAY have a positive-integer field named "TimeoutSeconds" whose value MUST be less than 99999999.
7
- A State MUST have a string field named "Type" whose value MUST be one of "Pass", "Succeed", "Fail", "Task", "Choice", "Wait", or "Parallel".
7
+ A State MUST have a string field named "Type" whose value MUST be one of "Pass", "Succeed", "Fail", "Task", "Choice", "Wait", "Parallel", or "Map".
8
8
  A State whose "Type" field's value is "Pass" is a "Pass State".
9
9
  A State whose "Type" field's value is "Succeed" is a "Succeed State".
10
10
  A State whose "Type" field's value is "Fail" is a "Fail State".
@@ -12,29 +12,36 @@ A State whose "Type" field's value is "Task" is a "Task State".
12
12
  A State whose "Type" field's value is "Choice" is a "Choice State".
13
13
  A State whose "Type" field's value is "Wait" is a "Wait State".
14
14
  A State whose "Type" field's value is "Parallel" is a "Parallel State".
15
+ A State whose "Type" field's value is "Map" is a "Map State".
15
16
  A State MAY have a string field named "Comment".
16
- Each of a Pass State, a Task State, a Wait State, and a Parallel State MAY have a boolean field named "End".
17
+ Each of a Pass State, a Task State, a Wait State, a Parallel State, and a Map State MAY have a boolean field named "End".
18
+ Each of a Pass State, a Task State, a Parallel State, and a Map State MAY have a field named "Parameters".
17
19
  A State whose "End" field's value is true is a "Terminal State".
18
20
  Each of a Succeed State and a Fail State is a "Terminal State".
19
21
  A State which is not a Terminal State or a Choice State MUST have a string field named "Next".
20
22
  A Terminal State MUST NOT have a field named "Next".
21
- A State MAY have a nullable-JSONPath field named "InputPath".
22
- Each of a Pass State, a Task State, and a Parallel State MAY have a nullable-referencePath field named "ResultPath".
23
- A State MAY have a nullable-JSONPath field named "OutputPath".
23
+ A State MAY have a field named "InputPath".
24
+ Each of a Pass State, a Task State, a Parallel State, and a Map State MAY have a nullable-referencePath field named "ResultPath".
25
+ Each of a Task State, a Parallel State, and a Map State MAY have a field named "ResultSelector".
26
+ A State MAY have a field named "OutputPath".
24
27
  A Pass State MAY have a field named "Result".
25
28
  A Fail State MUST NOT have a field named "InputPath".
26
29
  A Fail State MUST NOT have a field named "OutputPath".
27
30
  A Fail State MAY have a string field named "Cause".
28
31
  A Fail State MAY have a string field named "Error".
29
- Each of a Task State and a Parallel State MAY have an object-array field named "Retry"; each element is a "Retrier".
32
+ Each of a Task State, a Parallel State, and a Map State MAY have an object-array field named "Retry"; each element is a "Retrier".
30
33
  A Task State MUST have a URI field named "Resource".
31
34
  A Task State MAY have a positive-integer field named "TimeoutSeconds" whose value MUST be less than 99999999.
32
35
  A Task State MAY have a positive-integer field named "HeartbeatSeconds" whose value MUST be less than 99999999.
36
+ A Task State MAY have a referencePath field named "TimeoutSecondsPath".
37
+ A Task State MAY have a referencePath field named "HeartbeatSecondsPath".
38
+ A Task State MAY have only one of "TimeoutSeconds" and "TimeoutSecondsPath".
39
+ A Task State MAY have only one of "HeartbeatSeconds" and "HeartbeatSecondsPath".
33
40
  A Retrier MUST have a nonempty-string-array field named "ErrorEquals".
34
41
  A Retrier MAY have an positive-integer field named "IntervalSeconds".
35
42
  A Retrier MAY have a nonnegative-integer field named "MaxAttempts" whose value MUST be less than 99999999.
36
43
  A Retrier MAY have a float field named "BackoffRate" whose value MUST be greater than or equal to 1.0.
37
- Each of a Task State and a Parallel State MAY have an object-array field named "Catch"; each element is a "Catcher".
44
+ Each of a Task State, a Parallel State, and a Map State MAY have an object-array field named "Catch"; each element is a "Catcher".
38
45
  A Catcher MUST have an nonempty-string-array field named "ErrorEquals".
39
46
  A Catcher MUST have a string field named "Next".
40
47
  A Catcher MAY have a nullable-referencePath field named "ResultPath".
@@ -49,9 +56,9 @@ A Choice Rule MUST have a string field named "Next".
49
56
  A Choice Rule with an "And" field is a "Boolean".
50
57
  A Choice Rule with an "Or" field is a "Boolean".
51
58
  A Choice Rule with a "Not" field is a "Boolean".
52
- A Choice Rule MAY have a referencePath field named "Variable".
59
+ A Choice Rule MAY have a field named "Variable".
53
60
  A Choice Rule with a "Variable" field is a "Comparison".
54
- A Comparison MUST have a field named one of "StringEquals", "StringLessThan", "StringGreaterThan", "StringLessThanEquals", "StringGreaterThanEquals", "NumericEquals", "NumericLessThan", "NumericGreaterThan", "NumericLessThanEquals", "NumericGreaterThanEquals", "BooleanEquals", "TimestampEquals", "TimestampLessThan", "TimestampGreaterThan", "TimestampLessThanEquals", or "TimestampGreaterThanEquals".
61
+ A Comparison MUST have a field named one of "StringEquals", "StringLessThan", "StringGreaterThan", "StringLessThanEquals", "StringGreaterThanEquals", "NumericEquals", "NumericLessThan", "NumericGreaterThan", "NumericLessThanEquals", "NumericGreaterThanEquals", "BooleanEquals", "TimestampEquals", "TimestampLessThan", "TimestampGreaterThan", "TimestampLessThanEquals", "TimestampGreaterThanEquals", "StringEqualsPath", "StringLessThanPath", "StringGreaterThanPath", "StringLessThanEqualsPath", "StringGreaterThanEqualsPath", "NumericEqualsPath", "NumericLessThanPath", "NumericGreaterThanPath", "NumericLessThanEqualsPath", "NumericGreaterThanEqualsPath", "BooleanEqualsPath", "TimestampEqualsPath", "TimestampLessThanPath", "TimestampGreaterThanPath", "TimestampLessThanEqualsPath", "TimestampGreaterThanEqualsPath", "IsNull", "IsPresent", "IsNumeric", "IsString", "IsBoolean", "IsTimestamp", or "StringMatches".
55
62
  A Comparison MAY have a string field named "StringEquals".
56
63
  A Comparison MAY have a string field named "StringLessThan".
57
64
  A Comparison MAY have a string field named "StringGreaterThan".
@@ -68,6 +75,29 @@ A Comparison MAY have a timestamp field named "TimestampLessThan".
68
75
  A Comparison MAY have a timestamp field named "TimestampGreaterThan".
69
76
  A Comparison MAY have a timestamp field named "TimestampLessThanEquals".
70
77
  A Comparison MAY have a timestamp field named "TimestampGreaterThanEquals".
78
+ A Comparison MAY have a boolean field named "IsNull".
79
+ A Comparison MAY have a boolean field named "IsPresent".
80
+ A Comparison MAY have a boolean field named "IsNumeric".
81
+ A Comparison MAY have a boolean field named "IsString".
82
+ A Comparison MAY have a boolean field named "IsBoolean".
83
+ A Comparison MAY have a boolean field named "IsTimestamp".
84
+ A Comparison MAY have a string field named "StringMatches".
85
+ A Comparison MAY have a referencePath field named "StringEqualsPath".
86
+ A Comparison MAY have a referencePath field named "StringLessThanPath".
87
+ A Comparison MAY have a referencePath field named "StringGreaterThanPath".
88
+ A Comparison MAY have a referencePath field named "StringLessThanEqualsPath".
89
+ A Comparison MAY have a referencePath field named "StringGreaterThanEqualsPath".
90
+ A Comparison MAY have a referencePath field named "NumericEqualsPath".
91
+ A Comparison MAY have a referencePath field named "NumericLessThanPath".
92
+ A Comparison MAY have a referencePath field named "NumericGreaterThanPath".
93
+ A Comparison MAY have a referencePath field named "NumericLessThanEqualsPath".
94
+ A Comparison MAY have a referencePath field named "NumericGreaterThanEqualsPath".
95
+ A Comparison MAY have a referencePath field named "BooleanEqualsPath".
96
+ A Comparison MAY have a referencePath field named "TimestampEqualsPath".
97
+ A Comparison MAY have a referencePath field named "TimestampLessThanPath".
98
+ A Comparison MAY have a referencePath field named "TimestampGreaterThanPath".
99
+ A Comparison MAY have a referencePath field named "TimestampLessThanEqualsPath".
100
+ A Comparison MAY have a referencePath field named "TimestampGreaterThanEqualsPath".
71
101
  A Comparison MUST NOT have a field named "And".
72
102
  A Comparison MUST NOT have a field named "Or".
73
103
  A Comparison MUST NOT have a field named "Not".
@@ -78,7 +108,7 @@ A Nested Rule with an "And" field is a "Nested Boolean".
78
108
  A Nested Rule with an "Or" field is a "Nested Boolean".
79
109
  A Nested Rule with a "Not" field is a "Nested Boolean".
80
110
  A Nested Rule MUST NOT have a field named "Next".
81
- A Nested Rule MAY have a referencePath field named "Variable".
111
+ A Nested Rule MAY have a field named "Variable".
82
112
  A Nested Rule with a "Variable" field is a "Nested Comparison".
83
113
  A Nested Comparison MAY have a string field named "StringEquals".
84
114
  A Nested Comparison MAY have a string field named "StringLessThan".
@@ -96,6 +126,29 @@ A Nested Comparison MAY have a timestamp field named "TimestampLessThan".
96
126
  A Nested Comparison MAY have a timestamp field named "TimestampGreaterThan".
97
127
  A Nested Comparison MAY have a timestamp field named "TimestampLessThanEquals".
98
128
  A Nested Comparison MAY have a timestamp field named "TimestampGreaterThanEquals".
129
+ A Nested Comparison MAY have a boolean field named "IsNull".
130
+ A Nested Comparison MAY have a boolean field named "IsPresent".
131
+ A Nested Comparison MAY have a boolean field named "IsNumeric".
132
+ A Nested Comparison MAY have a boolean field named "IsString".
133
+ A Nested Comparison MAY have a boolean field named "IsBoolean".
134
+ A Nested Comparison MAY have a boolean field named "IsTimestamp".
135
+ A Nested Comparison MAY have a string field named "StringMatches".
136
+ A Nested Comparison MAY have a referencePath field named "StringEqualsPath".
137
+ A Nested Comparison MAY have a referencePath field named "StringLessThanPath".
138
+ A Nested Comparison MAY have a referencePath field named "StringGreaterThanPath".
139
+ A Nested Comparison MAY have a referencePath field named "StringLessThanEqualsPath".
140
+ A Nested Comparison MAY have a referencePath field named "StringGreaterThanEqualsPath".
141
+ A Nested Comparison MAY have a referencePath field named "NumericEqualsPath".
142
+ A Nested Comparison MAY have a referencePath field named "NumericLessThanPath".
143
+ A Nested Comparison MAY have a referencePath field named "NumericGreaterThanPath".
144
+ A Nested Comparison MAY have a referencePath field named "NumericLessThanEqualsPath".
145
+ A Nested Comparison MAY have a referencePath field named "NumericGreaterThanEqualsPath".
146
+ A Nested Comparison MAY have a referencePath field named "BooleanEqualsPath".
147
+ A Nested Comparison MAY have a referencePath field named "TimestampEqualsPath".
148
+ A Nested Comparison MAY have a referencePath field named "TimestampLessThanPath".
149
+ A Nested Comparison MAY have a referencePath field named "TimestampGreaterThanPath".
150
+ A Nested Comparison MAY have a referencePath field named "TimestampLessThanEqualsPath".
151
+ A Nested Comparison MAY have a referencePath field named "TimestampGreaterThanEqualsPath".
99
152
  A Nested Comparison MUST NOT have a field named "And".
100
153
  A Nested Comparison MUST NOT have a field named "Or".
101
154
  A Nested Comparison MUST NOT have a field named "Not".
@@ -106,6 +159,9 @@ A Wait State MAY have a referencePath field named "TimestampPath".
106
159
  A Wait State MUST have only one of "Seconds", "SecondsPath", "Timestamp", and "TimestampPath".
107
160
  A Wait State MUST have a field named one of "Seconds", "SecondsPath", "Timestamp", or "TimestampPath".
108
161
  A Parallel State MUST have an object-array field named "Branches"; each element is a "Branch".
109
- A Branch MUST have an object field named "States"; each element is a "State".
162
+ A Map State MUST have an object field named "Iterator"; its value is a "Branch".
163
+ A Map State MAY have a field named "ItemsPath".
164
+ A Map State MAY have a numeric field named "MaxConcurrency".
165
+ A Branch MUST have an object field named "States"; each field is a "State".
110
166
  A Branch MUST have a string field named "StartAt".
111
167
  A Branch MAY have a string field named "Comment".
@@ -12,7 +12,6 @@
12
12
  # permissions and limitations under the License.
13
13
  #!/usr/bin/env ruby
14
14
 
15
- $:.unshift("#{File.expand_path(File.dirname(__FILE__))}/../lib")
16
15
  require 'j2119'
17
16
  require 'statelint/state_node'
18
17
 
@@ -12,6 +12,8 @@
12
12
  # permissions and limitations under the License.
13
13
  #!/usr/bin/env ruby
14
14
 
15
+ require 'j2119'
16
+
15
17
  module StateMachineLint
16
18
 
17
19
  # Semantic validation that can't be expressed in a J2119 schema
@@ -19,7 +21,7 @@ module StateMachineLint
19
21
  class StateNode
20
22
 
21
23
  def initialize
22
- # We push States nodes on here when we traverse them.
24
+ # We push States nodes on here when we traverse them.
23
25
  # Then, whenever we find a "Next" or "Default" or "StartAt" node,
24
26
  # we validate that the target is there, and record that that
25
27
  # target has an incoming pointer
@@ -30,6 +32,10 @@ module StateMachineLint
30
32
  # We keep track of all the state names and complain about
31
33
  # dupes
32
34
  @all_state_names = {}
35
+ @payload_builder_fields = ["Parameters", "ResultSelector"]
36
+ @context_object_access_fields = [{"field"=> "InputPath", "nullable"=> true}, {"field"=> "OutputPath", "nullable"=> true}, {"field"=> "ItemsPath", "nullable"=> false}]
37
+ @choice_state_nested_operators = ["And", "Or", "Not"]
38
+ @intrinsic_invocation_regex = /^States\.(JsonToString|Format|StringToJson|Array)\(.+\)$/
33
39
  end
34
40
 
35
41
  def check(node, path, problems)
@@ -52,7 +58,22 @@ module StateMachineLint
52
58
  @current_states_incoming << []
53
59
  end
54
60
 
55
- node['States'].keys.each do |name|
61
+ states = node['States']
62
+ states.keys.each do |name|
63
+ child = states[name]
64
+ if child.is_a?(Hash)
65
+ child_path = path + '.' + name
66
+ probe_context_object_access(child, child_path, problems)
67
+ @payload_builder_fields.each do |field_name|
68
+ if child.key?(field_name)
69
+ probe_payload_builder(child[field_name], child_path, problems, field_name)
70
+ end
71
+ end
72
+ if child.key?("Type") && child["Type"] == "Choice" && child.key?("Choices")
73
+ probe_choice_state(child["Choices"], child_path + '.Choices' , problems)
74
+ end
75
+ end
76
+
56
77
  if @all_state_names[name]
57
78
  problems <<
58
79
  "State \"#{name}\", defined at #{path}.States, " +
@@ -66,7 +87,7 @@ module StateMachineLint
66
87
  check_for_terminal(node, path, problems)
67
88
 
68
89
  check_next(node, path, problems)
69
-
90
+
70
91
  check_States_ALL(node['Retry'], path + '.Retry', problems)
71
92
  check_States_ALL(node['Catch'], path + '.Catch', problems)
72
93
 
@@ -113,6 +134,75 @@ module StateMachineLint
113
134
  end
114
135
  end
115
136
 
137
+ def probe_context_object_access(node, path, problems)
138
+ @context_object_access_fields.each do |field|
139
+ field_name = field["field"]
140
+ nullable = field["nullable"]
141
+ if node.key?(field_name)
142
+ if !nullable && node[field_name].nil?
143
+ problems << "Field \"#{field_name}\" defined at \"#{path}\" should be non-null"
144
+ return
145
+ end
146
+ if !node[field_name].nil? and !is_valid_parameters_path?(node[field_name])
147
+ problems << "Field \"#{field_name}\" defined at \"#{path}\" is not a JSONPath"
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ def probe_choice_state(node, path, problems)
154
+ if node.is_a?(Hash)
155
+ if node.key?("Variable") && !is_valid_parameters_path?(node["Variable"])
156
+ problems << "Field \"Variable\" of Choice state at \"#{path}\" is not a JSONPath"
157
+ end
158
+ @choice_state_nested_operators.each do |operator|
159
+ if node.key?(operator)
160
+ probe_choice_state(node[operator], path + '.' + operator, problems)
161
+ end
162
+ end
163
+ elsif node.is_a?(Array)
164
+ node.size.times {|i| probe_choice_state(node[i], "#{path}[#{i}]", problems) }
165
+ end
166
+ end
167
+
168
+ # Search through Parameters for object nodes and check field semantics
169
+ def probe_payload_builder(node, path, problems, field_name)
170
+ if node.is_a?(Hash)
171
+ node.each do |name, val|
172
+ if name.end_with? '.$'
173
+ if !is_intrinsic_invocation?(val) && !is_valid_parameters_path?(val)
174
+ problems << "Field \"#{name}\" of #{field_name} at \"#{path}\" is not a JSONPath or intrinsic function expression"
175
+ end
176
+ else
177
+ probe_payload_builder(val, "#{path}.#{name}", problems, field_name)
178
+ end
179
+ end
180
+ elsif node.is_a?(Array)
181
+ node.size.times {|i| probe_payload_builder(node[i], "#{path}[#{i}]", problems, field_name) }
182
+ end
183
+ end
184
+
185
+ def is_intrinsic_invocation?(val)
186
+ if val.is_a?(String) && val.match?(@intrinsic_invocation_regex)
187
+ return true
188
+ end
189
+ return false
190
+ end
191
+
192
+ # Check if a string that ends with ".$" is a valid path
193
+ def is_valid_parameters_path?(val)
194
+ if !val.is_a?(String)
195
+ return false
196
+ end
197
+ # If the value begins with “$$”, the first dollar character is stripped off and the remainder MUST be a Path.
198
+ if val.start_with?("$$")
199
+ path_to_check = val.gsub(/^\$/, "")
200
+ J2119::JSONPathChecker.is_path?(path_to_check)
201
+ else
202
+ J2119::JSONPathChecker.is_path?(val)
203
+ end
204
+ end
205
+
116
206
  def check_for_terminal(node, path, problems)
117
207
  if node['States'] && node['States'].is_a?(Hash)
118
208
  terminal_found = false
@@ -131,12 +221,12 @@ module StateMachineLint
131
221
  end
132
222
  end
133
223
  end
134
-
224
+
135
225
  def check_States_ALL(node, path, problems)
136
226
  if !node.is_a?(Array)
137
227
  return
138
228
  end
139
-
229
+
140
230
  i = 0
141
231
  node.each do |element|
142
232
  if element.is_a?(Hash)
@@ -1,7 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'statelint'
3
- s.version = '0.1.4'
4
- s.date = '2016-09-28'
3
+ s.version = '0.5.0'
5
4
  s.summary = "State Machine JSON validator"
6
5
  s.description = "Validates a JSON object representing a State Machine"
7
6
  s.authors = ["Tim Bray"]
@@ -11,7 +10,15 @@ Gem::Specification.new do |s|
11
10
  f.match(%r{^(spec|test)/})
12
11
  end
13
12
 
14
- s.homepage = 'http://rubygems.org/gems/statelint'
15
- s.license = 'Apache 2.0'
16
- s.add_runtime_dependency "j2119"
13
+ s.homepage = 'https://github.com/awslabs/statelint'
14
+ s.license = 'Apache-2.0'
15
+
16
+ s.required_ruby_version = '>= 1.9.2'
17
+
18
+ s.add_runtime_dependency 'j2119', '~> 0.4', '>= 0.4.0'
19
+
20
+ s.metadata = {
21
+ 'source_code_uri' => 'https://github.com/awslabs/statelint',
22
+ "bug_tracker_uri" => 'https://github.com/awslabs/statelint/issues'
23
+ }
17
24
  end
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statelint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Bray
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-28 00:00:00.000000000 Z
11
+ date: 2020-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: j2119
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.4'
17
20
  - - ">="
18
21
  - !ruby/object:Gem::Version
19
- version: '0'
22
+ version: 0.4.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.4'
24
30
  - - ">="
25
31
  - !ruby/object:Gem::Version
26
- version: '0'
32
+ version: 0.4.0
27
33
  description: Validates a JSON object representing a State Machine
28
34
  email: timbray@amazon.com
29
35
  executables:
@@ -42,10 +48,12 @@ files:
42
48
  - lib/statelint.rb
43
49
  - lib/statelint/state_node.rb
44
50
  - statelint.gemspec
45
- homepage: http://rubygems.org/gems/statelint
51
+ homepage: https://github.com/awslabs/statelint
46
52
  licenses:
47
- - Apache 2.0
48
- metadata: {}
53
+ - Apache-2.0
54
+ metadata:
55
+ source_code_uri: https://github.com/awslabs/statelint
56
+ bug_tracker_uri: https://github.com/awslabs/statelint/issues
49
57
  post_install_message:
50
58
  rdoc_options: []
51
59
  require_paths:
@@ -54,7 +62,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
62
  requirements:
55
63
  - - ">="
56
64
  - !ruby/object:Gem::Version
57
- version: '0'
65
+ version: 1.9.2
58
66
  required_rubygems_version: !ruby/object:Gem::Requirement
59
67
  requirements:
60
68
  - - ">="
@@ -62,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
70
  version: '0'
63
71
  requirements: []
64
72
  rubyforge_project:
65
- rubygems_version: 2.0.14.1
73
+ rubygems_version: 2.7.4
66
74
  signing_key:
67
75
  specification_version: 4
68
76
  summary: State Machine JSON validator