literal 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +100 -54
  3. data/lib/literal/data.rb +24 -11
  4. data/lib/literal/data_property.rb +16 -0
  5. data/lib/literal/data_structure.rb +60 -0
  6. data/lib/literal/enum.rb +176 -0
  7. data/lib/literal/errors/argument_error.rb +5 -0
  8. data/lib/literal/errors/error.rb +4 -0
  9. data/lib/literal/errors/type_error.rb +10 -0
  10. data/lib/literal/null.rb +9 -0
  11. data/lib/literal/object.rb +5 -0
  12. data/lib/literal/properties/data_schema.rb +9 -0
  13. data/lib/literal/properties/schema.rb +118 -0
  14. data/lib/literal/properties.rb +91 -0
  15. data/lib/literal/property.rb +196 -0
  16. data/lib/literal/struct.rb +8 -34
  17. data/lib/literal/types/any_type.rb +10 -3
  18. data/lib/literal/types/array_type.rb +10 -9
  19. data/lib/literal/types/boolean_type.rb +18 -1
  20. data/lib/literal/types/callable_type.rb +12 -0
  21. data/lib/literal/types/class_type.rb +10 -9
  22. data/lib/literal/types/constraint_type.rb +16 -0
  23. data/lib/literal/types/descendant_type.rb +13 -0
  24. data/lib/literal/types/enumerable_type.rb +10 -9
  25. data/lib/literal/types/falsy_type.rb +12 -0
  26. data/lib/literal/types/float_type.rb +7 -10
  27. data/lib/literal/types/frozen_type.rb +14 -0
  28. data/lib/literal/types/hash_type.rb +11 -10
  29. data/lib/literal/types/integer_type.rb +7 -10
  30. data/lib/literal/types/interface_type.rb +11 -9
  31. data/lib/literal/types/intersection_type.rb +20 -0
  32. data/lib/literal/types/json_data_type.rb +21 -0
  33. data/lib/literal/types/lambda_type.rb +12 -0
  34. data/lib/literal/types/map_type.rb +16 -0
  35. data/lib/literal/types/never_type.rb +12 -0
  36. data/lib/literal/types/nilable_type.rb +14 -0
  37. data/lib/literal/types/not_type.rb +14 -0
  38. data/lib/literal/types/procable_type.rb +12 -0
  39. data/lib/literal/types/range_type.rb +20 -0
  40. data/lib/literal/types/set_type.rb +10 -9
  41. data/lib/literal/types/string_type.rb +10 -0
  42. data/lib/literal/types/symbol_type.rb +10 -0
  43. data/lib/literal/types/truthy_type.rb +12 -0
  44. data/lib/literal/types/tuple_type.rb +12 -9
  45. data/lib/literal/types/union_type.rb +43 -9
  46. data/lib/literal/types/void_type.rb +12 -0
  47. data/lib/literal/types.rb +195 -54
  48. data/lib/literal/version.rb +1 -1
  49. data/lib/literal.rb +28 -10
  50. data/lib/literal.test.rb +5 -0
  51. metadata +41 -19
  52. data/CHANGELOG.md +0 -5
  53. data/CODE_OF_CONDUCT.md +0 -84
  54. data/Gemfile +0 -9
  55. data/Gemfile.lock +0 -29
  56. data/Rakefile +0 -12
  57. data/lib/literal/attributes.rb +0 -33
  58. data/lib/literal/initializer.rb +0 -11
  59. data/lib/literal/model.rb +0 -22
  60. data/literal.gemspec +0 -37
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ module Literal::Types::NeverType
5
+ def self.inspect = "_Never"
6
+
7
+ def self.===(value)
8
+ false
9
+ end
10
+
11
+ freeze
12
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ class Literal::Types::NilableType
5
+ def initialize(type)
6
+ @type = type
7
+ end
8
+
9
+ def inspect = "_Nilable(#{@type.inspect})"
10
+
11
+ def ===(value)
12
+ nil === value || @type === value
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ class Literal::Types::NotType
5
+ def initialize(type)
6
+ @type = type
7
+ end
8
+
9
+ def inspect = "_Not(#{@type.inspect})"
10
+
11
+ def ===(value)
12
+ !(@type === value)
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ module Literal::Types::ProcableType
5
+ def self.inspect = "_Procable"
6
+
7
+ def self.===(value)
8
+ Proc === value || value.respond_to?(:to_proc)
9
+ end
10
+
11
+ freeze
12
+ end
@@ -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
- def initialize(type)
3
- @type = type
4
- end
5
+ def initialize(type)
6
+ @type = type
7
+ end
5
8
 
6
- def inspect
7
- "Set(#{@type.inspect})"
8
- end
9
+ def inspect = "_Set(#{@type.inspect})"
9
10
 
10
- def ===(value)
11
- value.is_a?(::Set) && value.all? { |item| @type === item }
12
- end
11
+ def ===(value)
12
+ Set === value && value.all? { |item| @type === item }
13
+ end
13
14
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ class Literal::Types::StringType < Literal::Types::ConstraintType
5
+ def inspect = "_String(#{@constraint.inspect})"
6
+
7
+ def ===(value)
8
+ String === value && super
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ class Literal::Types::SymbolType < Literal::Types::ConstraintType
5
+ def inspect = "_Symbol(#{@constraint.inspect})"
6
+
7
+ def ===(value)
8
+ Symbol === value && super
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ module Literal::Types::TruthyType
5
+ def self.inspect = "_Truthy"
6
+
7
+ def self.===(value)
8
+ !!value
9
+ end
10
+
11
+ freeze
12
+ end
@@ -1,13 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
1
4
  class Literal::Types::TupleType
2
- def initialize(*types)
3
- @types = types
4
- end
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
- def inspect
7
- "Tuple(#{@types.map(&:inspect).join(", ")})"
8
- end
11
+ def inspect = "_Tuple(#{@types.map(&:inspect).join(', ')})"
9
12
 
10
- def ===(value)
11
- value.is_a?(::Enumerable) && value.size == @types.size && value.zip(@types).all? { |value, type| type === value }
12
- end
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
- def initialize(*types)
3
- @types = types
4
- end
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
- def inspect
7
- "Union(#{@types.map(&:inspect).join(", ")})"
8
- end
40
+ private
9
41
 
10
- def ===(value)
11
- @types.any? { |type| type === value }
12
- end
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
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api private
4
+ module Literal::Types::VoidType
5
+ def self.inspect = "_Void"
6
+
7
+ def self.===(_)
8
+ true
9
+ end
10
+
11
+ freeze
12
+ end
data/lib/literal/types.rb CHANGED
@@ -1,56 +1,197 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Literal::Types
2
- def _Union(*types)
3
- raise Literal::ArgumentError, "Union type must have at least two types." if types.size < 2
4
- Literal::Types::UnionType.new(*types)
5
- end
6
-
7
- def _Array(type)
8
- Literal::Types::ArrayType.new(type)
9
- end
10
-
11
- def _Set(type)
12
- Literal::Types::SetType.new(type)
13
- end
14
-
15
- def _Enumerable(type)
16
- Literal::Types::EnumerableType.new(type)
17
- end
18
-
19
- def _Hash(key_type, value_type)
20
- Literal::Types::HashType.new(key_type, value_type)
21
- end
22
-
23
- def _Interface(*methods)
24
- raise Literal::ArgumentError, "Interface type must have at least one method." if methods.size < 1
25
- Literal::Types::InterfaceType.new(*methods)
26
- end
27
-
28
- def _Maybe(type)
29
- _Union(type, nil)
30
- end
31
-
32
- def _Any
33
- Literal::Types::AnyType
34
- end
35
-
36
- def _Boolean
37
- Literal::Types::BooleanType
38
- end
39
-
40
- def _Class(type)
41
- Literal::Types::ClassType.new(type)
42
- end
43
-
44
- def _Tuple(*types)
45
- raise Literal::ArgumentError, "Tuple type must have at least one type." if types.size < 1
46
- Literal::Types::TupleType.new(*types)
47
- end
48
-
49
- def _Integer(range)
50
- Literal::Types::IntegerType.new(range)
51
- end
52
-
53
- def _Float(range)
54
- Literal::Types::FloatType.new(range)
55
- end
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Literal
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
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
- Loader = Zeitwerk::Loader.for_gem.tap(&:setup)
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
- module Error; end
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
- class TypeError < ::TypeError
11
- include Error
12
- end
22
+ def self.Enum(type)
23
+ Class.new(Literal::Enum) do
24
+ prop :value, type, :positional
25
+ end
26
+ end
13
27
 
14
- class ArgumentError < ::ArgumentError
15
- include Error
16
- end
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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ test do
4
+ expect(Literal::VERSION).to_be_a String
5
+ end
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.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Drapper
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-03 00:00:00.000000000 Z
11
+ date: 2024-06-30 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Strict Attributes is a gem that allows you to define strict attributes
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/attributes.rb
23
+ - lib/literal.test.rb
30
24
  - lib/literal/data.rb
31
- - lib/literal/initializer.rb
32
- - lib/literal/model.rb
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/master/CHANGELOG.md
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.6.0
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.4.6
94
+ rubygems_version: 3.5.13
72
95
  signing_key:
73
96
  specification_version: 4
74
- summary: Strict Attributes is a gem that allows you to define strict attributes on
75
- your models.
97
+ summary: A literal Ruby gem
76
98
  test_files: []
data/CHANGELOG.md DELETED
@@ -1,5 +0,0 @@
1
- ## [Unreleased]
2
-
3
- ## [0.1.0] - 2023-05-03
4
-
5
- - Initial release