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.
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.1"
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.1
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.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.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