literal 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +100 -54
- data/lib/literal/data.rb +24 -11
- data/lib/literal/data_property.rb +16 -0
- data/lib/literal/data_structure.rb +60 -0
- data/lib/literal/enum.rb +176 -0
- data/lib/literal/errors/argument_error.rb +5 -0
- data/lib/literal/errors/error.rb +4 -0
- data/lib/literal/errors/type_error.rb +10 -0
- data/lib/literal/null.rb +9 -0
- data/lib/literal/object.rb +5 -0
- data/lib/literal/properties/data_schema.rb +9 -0
- data/lib/literal/properties/schema.rb +118 -0
- data/lib/literal/properties.rb +91 -0
- data/lib/literal/property.rb +196 -0
- data/lib/literal/struct.rb +8 -34
- data/lib/literal/types/any_type.rb +10 -3
- data/lib/literal/types/array_type.rb +10 -9
- data/lib/literal/types/boolean_type.rb +18 -1
- data/lib/literal/types/callable_type.rb +12 -0
- data/lib/literal/types/class_type.rb +10 -9
- data/lib/literal/types/constraint_type.rb +16 -0
- data/lib/literal/types/descendant_type.rb +13 -0
- data/lib/literal/types/enumerable_type.rb +10 -9
- data/lib/literal/types/falsy_type.rb +12 -0
- data/lib/literal/types/float_type.rb +7 -10
- data/lib/literal/types/frozen_type.rb +14 -0
- data/lib/literal/types/hash_type.rb +11 -10
- data/lib/literal/types/integer_type.rb +7 -10
- data/lib/literal/types/interface_type.rb +11 -9
- data/lib/literal/types/intersection_type.rb +20 -0
- data/lib/literal/types/json_data_type.rb +21 -0
- data/lib/literal/types/lambda_type.rb +12 -0
- data/lib/literal/types/map_type.rb +16 -0
- data/lib/literal/types/never_type.rb +12 -0
- data/lib/literal/types/nilable_type.rb +14 -0
- data/lib/literal/types/not_type.rb +14 -0
- data/lib/literal/types/procable_type.rb +12 -0
- data/lib/literal/types/range_type.rb +20 -0
- data/lib/literal/types/set_type.rb +10 -9
- data/lib/literal/types/string_type.rb +10 -0
- data/lib/literal/types/symbol_type.rb +10 -0
- data/lib/literal/types/truthy_type.rb +12 -0
- data/lib/literal/types/tuple_type.rb +12 -9
- data/lib/literal/types/union_type.rb +43 -9
- data/lib/literal/types/void_type.rb +12 -0
- data/lib/literal/types.rb +195 -54
- data/lib/literal/version.rb +1 -1
- data/lib/literal.rb +28 -10
- data/lib/literal.test.rb +5 -0
- metadata +41 -19
- data/CHANGELOG.md +0 -5
- data/CODE_OF_CONDUCT.md +0 -84
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -29
- data/Rakefile +0 -12
- data/lib/literal/attributes.rb +0 -33
- data/lib/literal/initializer.rb +0 -11
- data/lib/literal/model.rb +0 -22
- data/literal.gemspec +0 -37
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
class Literal::Types::RangeType
|
5
|
+
def initialize(type)
|
6
|
+
@type = type
|
7
|
+
end
|
8
|
+
|
9
|
+
def inspect = "_Range(#{@type.inspect})"
|
10
|
+
|
11
|
+
def ===(value)
|
12
|
+
Range === value && (
|
13
|
+
(
|
14
|
+
@type === value.begin && (nil === value.end || @type === value.end)
|
15
|
+
) || (
|
16
|
+
@type === value.end && nil === value.begin
|
17
|
+
)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
@@ -1,13 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
1
4
|
class Literal::Types::SetType
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
+
def initialize(type)
|
6
|
+
@type = type
|
7
|
+
end
|
5
8
|
|
6
|
-
|
7
|
-
"Set(#{@type.inspect})"
|
8
|
-
end
|
9
|
+
def inspect = "_Set(#{@type.inspect})"
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
def ===(value)
|
12
|
+
Set === value && value.all? { |item| @type === item }
|
13
|
+
end
|
13
14
|
end
|
@@ -1,13 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
1
4
|
class Literal::Types::TupleType
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
+
def initialize(*types)
|
6
|
+
raise Literal::ArgumentError.new("_Tuple type must have at least one type.") if types.size < 1
|
7
|
+
|
8
|
+
@types = types
|
9
|
+
end
|
5
10
|
|
6
|
-
|
7
|
-
"Tuple(#{@types.map(&:inspect).join(", ")})"
|
8
|
-
end
|
11
|
+
def inspect = "_Tuple(#{@types.map(&:inspect).join(', ')})"
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
+
def ===(value)
|
14
|
+
Array === value && value.size == @types.size && @types.each_with_index.all? { |t, i| t === value[i] }
|
15
|
+
end
|
13
16
|
end
|
@@ -1,13 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Literal::Types::UnionType
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
def initialize(*types)
|
7
|
+
raise Literal::ArgumentError.new("_Union type must have at least one type.") if types.size < 1
|
8
|
+
|
9
|
+
@types = Set[]
|
10
|
+
load_types(types)
|
11
|
+
@types.freeze
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect = "_Union(#{@types.inspect})"
|
15
|
+
|
16
|
+
def ===(value)
|
17
|
+
@types.any? { |type| type === value }
|
18
|
+
end
|
19
|
+
|
20
|
+
def each(&)
|
21
|
+
@types.each(&)
|
22
|
+
end
|
23
|
+
|
24
|
+
def deconstruct
|
25
|
+
@types.to_a
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](key)
|
29
|
+
if @types.include?(key)
|
30
|
+
key
|
31
|
+
else
|
32
|
+
raise ArgumentError.new("#{key} not in #{inspect}")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
attr_reader :types
|
5
39
|
|
6
|
-
|
7
|
-
"Union(#{@types.map(&:inspect).join(", ")})"
|
8
|
-
end
|
40
|
+
private
|
9
41
|
|
10
|
-
|
11
|
-
|
12
|
-
|
42
|
+
def load_types(types)
|
43
|
+
types.each do |type|
|
44
|
+
(Literal::Types::UnionType === type) ? load_types(type.types) : @types << type
|
45
|
+
end
|
46
|
+
end
|
13
47
|
end
|
data/lib/literal/types.rb
CHANGED
@@ -1,56 +1,197 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Literal::Types
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
4
|
+
autoload :AnyType, "literal/types/any_type"
|
5
|
+
autoload :ArrayType, "literal/types/array_type"
|
6
|
+
autoload :BooleanType, "literal/types/boolean_type"
|
7
|
+
autoload :CallableType, "literal/types/callable_type"
|
8
|
+
autoload :ClassType, "literal/types/class_type"
|
9
|
+
autoload :ConstraintType, "literal/types/constraint_type"
|
10
|
+
autoload :DescendantType, "literal/types/descendant_type"
|
11
|
+
autoload :EnumerableType, "literal/types/enumerable_type"
|
12
|
+
autoload :FalsyType, "literal/types/falsy_type"
|
13
|
+
autoload :FloatType, "literal/types/float_type"
|
14
|
+
autoload :FrozenType, "literal/types/frozen_type"
|
15
|
+
autoload :HashType, "literal/types/hash_type"
|
16
|
+
autoload :IntegerType, "literal/types/integer_type"
|
17
|
+
autoload :InterfaceType, "literal/types/interface_type"
|
18
|
+
autoload :IntersectionType, "literal/types/intersection_type"
|
19
|
+
autoload :JSONDataType, "literal/types/json_data_type"
|
20
|
+
autoload :LambdaType, "literal/types/lambda_type"
|
21
|
+
autoload :MapType, "literal/types/map_type"
|
22
|
+
autoload :NeverType, "literal/types/never_type"
|
23
|
+
autoload :NilableType, "literal/types/nilable_type"
|
24
|
+
autoload :NotType, "literal/types/not_type"
|
25
|
+
autoload :ProcableType, "literal/types/procable_type"
|
26
|
+
autoload :RangeType, "literal/types/range_type"
|
27
|
+
autoload :SetType, "literal/types/set_type"
|
28
|
+
autoload :ShapeType, "literal/types/shape_type"
|
29
|
+
autoload :StringType, "literal/types/string_type"
|
30
|
+
autoload :SymbolType, "literal/types/symbol_type"
|
31
|
+
autoload :TruthyType, "literal/types/truthy_type"
|
32
|
+
autoload :TupleType, "literal/types/tuple_type"
|
33
|
+
autoload :UnionType, "literal/types/union_type"
|
34
|
+
autoload :VoidType, "literal/types/void_type"
|
35
|
+
|
36
|
+
# Matches any value except `nil`. Use `_Nilable(_Any)` or `_Void` to match any value including `nil`.
|
37
|
+
def _Any
|
38
|
+
Literal::Types::AnyType
|
39
|
+
end
|
40
|
+
|
41
|
+
# Matches if the value is an `Array` and all the elements match the given type.
|
42
|
+
def _Array(...)
|
43
|
+
Literal::Types::ArrayType.new(...)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Matches if the value is `true` or `false`.
|
47
|
+
def _Boolean
|
48
|
+
Literal::Types::BooleanType
|
49
|
+
end
|
50
|
+
|
51
|
+
# Matches if the value responds to `#call`.
|
52
|
+
def _Callable
|
53
|
+
Literal::Types::CallableType
|
54
|
+
end
|
55
|
+
|
56
|
+
# Matches if the value either the given class or a subclass of it.
|
57
|
+
def _Class(...)
|
58
|
+
Literal::Types::ClassType.new(...)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Similar to `_Intersection`, but allows you to specify attribute constraints as keyword arguments.
|
62
|
+
# @example
|
63
|
+
# _Constraint(Array, size: 1..3)
|
64
|
+
def _Constraint(...)
|
65
|
+
Literal::Types::ConstraintType.new(...)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Matches if the value is a descendant of the given class.
|
69
|
+
def _Descendant(...)
|
70
|
+
Literal::Types::DescendantType.new(...)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Matches if the value is an `Enumerable` and all its elements match the given type.
|
74
|
+
def _Enumerable(...)
|
75
|
+
Literal::Types::EnumerableType.new(...)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Matches *"falsy"* values (`nil` and `false`).
|
79
|
+
def _Falsy
|
80
|
+
Literal::Types::FalsyType
|
81
|
+
end
|
82
|
+
|
83
|
+
# Matches if the value is a `Float` and matches the given constraint.
|
84
|
+
# You could use a `Range`, for example, as a constraint.
|
85
|
+
# If you don't need a constraint, use `Float` instead of `_Float`.
|
86
|
+
def _Float(...)
|
87
|
+
Literal::Types::FloatType.new(...)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Matches if the value is *frozen*.
|
91
|
+
def _Frozen(...)
|
92
|
+
Literal::Types::FrozenType.new(...)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Matches if the value is a `Hash` and all the keys and values match the given types.
|
96
|
+
def _Hash(...)
|
97
|
+
Literal::Types::HashType.new(...)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Matches if the value is an `Integer` and matches the given constraint.
|
101
|
+
# You could use a `Range`, for example, as a constraint.
|
102
|
+
# If you don't need a constraint, use `Integer` instead of `_Integer`.
|
103
|
+
# @example
|
104
|
+
# attribute :age, _Integer(18..127)
|
105
|
+
def _Integer(...)
|
106
|
+
Literal::Types::IntegerType.new(...)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Matches if the value responds to all the given methods.
|
110
|
+
def _Interface(...)
|
111
|
+
Literal::Types::InterfaceType.new(...)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Matches if *all* given types are matched.
|
115
|
+
def _Intersection(...)
|
116
|
+
Literal::Types::IntersectionType.new(...)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Ensures the value is valid JSON data (i.e. it came from JSON.parse).
|
120
|
+
def _JSONData
|
121
|
+
Literal::Types::JSONDataType
|
122
|
+
end
|
123
|
+
|
124
|
+
# Matches if the value is a `Proc` and `#lambda?` returns truthy.
|
125
|
+
def _Lambda
|
126
|
+
Literal::Types::LambdaType
|
127
|
+
end
|
128
|
+
|
129
|
+
def _Map(...)
|
130
|
+
Literal::Types::MapType.new(...)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Never matches any value.
|
134
|
+
def _Never
|
135
|
+
Literal::Types::NeverType
|
136
|
+
end
|
137
|
+
|
138
|
+
# Matches if the value is either `nil` or the given type.
|
139
|
+
def _Nilable(...)
|
140
|
+
Literal::Types::NilableType.new(...)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Matches if the given type is *not* matched.
|
144
|
+
def _Not(...)
|
145
|
+
Literal::Types::NotType.new(...)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Matches if the value is a `Proc` or responds to `#to_proc`.
|
149
|
+
def _Procable
|
150
|
+
Literal::Types::ProcableType
|
151
|
+
end
|
152
|
+
|
153
|
+
# Matches if the value is a `Range` of the given type.
|
154
|
+
def _Range(...)
|
155
|
+
Literal::Types::RangeType.new(...)
|
156
|
+
end
|
157
|
+
|
158
|
+
# Matches if the value is a `Set` and all the elements match the given type.
|
159
|
+
def _Set(...)
|
160
|
+
Literal::Types::SetType.new(...)
|
161
|
+
end
|
162
|
+
|
163
|
+
# Ensures a value matches the given shape of a Hash
|
164
|
+
def _Shape(...)
|
165
|
+
Literal::Types::ShapeType.new(...)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Matches if the value is a `String` and matches the given constraints.
|
169
|
+
# If you don't need any constraints, use `String` instead of `_String`.
|
170
|
+
def _String(...)
|
171
|
+
Literal::Types::StringType.new(...)
|
172
|
+
end
|
173
|
+
|
174
|
+
# Matches if the value is a `Symbol` and matches the given constraint.
|
175
|
+
def _Symbol(...)
|
176
|
+
Literal::Types::SymbolType.new(...)
|
177
|
+
end
|
178
|
+
|
179
|
+
# Matches *"truthy"* values (anything except `nil` and `false`).
|
180
|
+
def _Truthy
|
181
|
+
Literal::Types::TruthyType
|
182
|
+
end
|
183
|
+
|
184
|
+
# Matches if the value is an `Array` and each element matches the given types in order.
|
185
|
+
def _Tuple(...)
|
186
|
+
Literal::Types::TupleType.new(...)
|
187
|
+
end
|
188
|
+
|
189
|
+
# Matches if *any* given type is matched.
|
190
|
+
def _Union(...)
|
191
|
+
Literal::Types::UnionType.new(...)
|
192
|
+
end
|
193
|
+
|
194
|
+
def _Void
|
195
|
+
Literal::Types::VoidType
|
196
|
+
end
|
56
197
|
end
|
data/lib/literal/version.rb
CHANGED
data/lib/literal.rb
CHANGED
@@ -1,17 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "literal/version"
|
4
|
-
|
5
3
|
module Literal
|
6
|
-
|
4
|
+
TYPE_CHECKS_DISABLED = ENV["LITERAL_TYPE_CHECKS"] == "false"
|
5
|
+
|
6
|
+
autoload :Data, "literal/data"
|
7
|
+
autoload :DataProperty, "literal/data_property"
|
8
|
+
autoload :DataStructure, "literal/data_structure"
|
9
|
+
autoload :Enum, "literal/enum"
|
10
|
+
autoload :Null, "literal/null"
|
11
|
+
autoload :Object, "literal/object"
|
12
|
+
autoload :Properties, "literal/properties"
|
13
|
+
autoload :Property, "literal/property"
|
14
|
+
autoload :Struct, "literal/struct"
|
15
|
+
autoload :Types, "literal/types"
|
7
16
|
|
8
|
-
|
17
|
+
# Errors
|
18
|
+
autoload :Error, "literal/errors/error"
|
19
|
+
autoload :TypeError, "literal/errors/type_error"
|
20
|
+
autoload :ArgumentError, "literal/errors/argument_error"
|
9
21
|
|
10
|
-
|
11
|
-
|
12
|
-
|
22
|
+
def self.Enum(type)
|
23
|
+
Class.new(Literal::Enum) do
|
24
|
+
prop :value, type, :positional
|
25
|
+
end
|
26
|
+
end
|
13
27
|
|
14
|
-
|
15
|
-
|
16
|
-
|
28
|
+
def self.check(value, type)
|
29
|
+
if TYPE_CHECKS_DISABLED || type === value
|
30
|
+
true
|
31
|
+
else
|
32
|
+
raise Literal::TypeError.expected(value, to_be_a: type)
|
33
|
+
end
|
34
|
+
end
|
17
35
|
end
|
data/lib/literal.test.rb
ADDED
metadata
CHANGED
@@ -1,58 +1,81 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: literal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Drapper
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
14
|
-
on your models.
|
13
|
+
description: ''
|
15
14
|
email:
|
16
15
|
- joel@drapper.me
|
17
16
|
executables: []
|
18
17
|
extensions: []
|
19
18
|
extra_rdoc_files: []
|
20
19
|
files:
|
21
|
-
- CHANGELOG.md
|
22
|
-
- CODE_OF_CONDUCT.md
|
23
|
-
- Gemfile
|
24
|
-
- Gemfile.lock
|
25
20
|
- LICENSE.txt
|
26
21
|
- README.md
|
27
|
-
- Rakefile
|
28
22
|
- lib/literal.rb
|
29
|
-
- lib/literal
|
23
|
+
- lib/literal.test.rb
|
30
24
|
- lib/literal/data.rb
|
31
|
-
- lib/literal/
|
32
|
-
- lib/literal/
|
25
|
+
- lib/literal/data_property.rb
|
26
|
+
- lib/literal/data_structure.rb
|
27
|
+
- lib/literal/enum.rb
|
28
|
+
- lib/literal/errors/argument_error.rb
|
29
|
+
- lib/literal/errors/error.rb
|
30
|
+
- lib/literal/errors/type_error.rb
|
31
|
+
- lib/literal/null.rb
|
32
|
+
- lib/literal/object.rb
|
33
|
+
- lib/literal/properties.rb
|
34
|
+
- lib/literal/properties/data_schema.rb
|
35
|
+
- lib/literal/properties/schema.rb
|
36
|
+
- lib/literal/property.rb
|
33
37
|
- lib/literal/struct.rb
|
34
38
|
- lib/literal/types.rb
|
35
39
|
- lib/literal/types/any_type.rb
|
36
40
|
- lib/literal/types/array_type.rb
|
37
41
|
- lib/literal/types/boolean_type.rb
|
42
|
+
- lib/literal/types/callable_type.rb
|
38
43
|
- lib/literal/types/class_type.rb
|
44
|
+
- lib/literal/types/constraint_type.rb
|
45
|
+
- lib/literal/types/descendant_type.rb
|
39
46
|
- lib/literal/types/enumerable_type.rb
|
47
|
+
- lib/literal/types/falsy_type.rb
|
40
48
|
- lib/literal/types/float_type.rb
|
49
|
+
- lib/literal/types/frozen_type.rb
|
41
50
|
- lib/literal/types/hash_type.rb
|
42
51
|
- lib/literal/types/integer_type.rb
|
43
52
|
- lib/literal/types/interface_type.rb
|
53
|
+
- lib/literal/types/intersection_type.rb
|
54
|
+
- lib/literal/types/json_data_type.rb
|
55
|
+
- lib/literal/types/lambda_type.rb
|
56
|
+
- lib/literal/types/map_type.rb
|
57
|
+
- lib/literal/types/never_type.rb
|
58
|
+
- lib/literal/types/nilable_type.rb
|
59
|
+
- lib/literal/types/not_type.rb
|
60
|
+
- lib/literal/types/procable_type.rb
|
61
|
+
- lib/literal/types/range_type.rb
|
44
62
|
- lib/literal/types/set_type.rb
|
63
|
+
- lib/literal/types/string_type.rb
|
64
|
+
- lib/literal/types/symbol_type.rb
|
65
|
+
- lib/literal/types/truthy_type.rb
|
45
66
|
- lib/literal/types/tuple_type.rb
|
46
67
|
- lib/literal/types/union_type.rb
|
68
|
+
- lib/literal/types/void_type.rb
|
47
69
|
- lib/literal/version.rb
|
48
|
-
- literal.gemspec
|
49
70
|
homepage: https://github.com/joeldrapper/literal
|
50
71
|
licenses:
|
51
72
|
- MIT
|
52
73
|
metadata:
|
53
74
|
homepage_uri: https://github.com/joeldrapper/literal
|
54
75
|
source_code_uri: https://github.com/joeldrapper/literal
|
55
|
-
changelog_uri: https://github.com/joeldrapper/literal/blob/
|
76
|
+
changelog_uri: https://github.com/joeldrapper/literal/blob/main/CHANGELOG.md
|
77
|
+
funding_uri: https://github.com/sponsors/joeldrapper
|
78
|
+
rubygems_mfa_required: 'true'
|
56
79
|
post_install_message:
|
57
80
|
rdoc_options: []
|
58
81
|
require_paths:
|
@@ -61,16 +84,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
61
84
|
requirements:
|
62
85
|
- - ">="
|
63
86
|
- !ruby/object:Gem::Version
|
64
|
-
version: 2
|
87
|
+
version: '3.2'
|
65
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
89
|
requirements:
|
67
90
|
- - ">="
|
68
91
|
- !ruby/object:Gem::Version
|
69
92
|
version: '0'
|
70
93
|
requirements: []
|
71
|
-
rubygems_version: 3.
|
94
|
+
rubygems_version: 3.5.13
|
72
95
|
signing_key:
|
73
96
|
specification_version: 4
|
74
|
-
summary:
|
75
|
-
your models.
|
97
|
+
summary: A literal Ruby gem
|
76
98
|
test_files: []
|