literal 0.1.0 → 0.2.1
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 +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.1
|
4
|
+
version: 0.2.1
|
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:
|
87
|
+
version: '3.1'
|
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: []
|