sigt 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bcecf066ed19e5b18159d39077989d93bd0536388a57c33699c9dae801d4fd16
4
+ data.tar.gz: 78380ed65941b6407de7cb247704b2b053b6e499a36dc5bfaba5dfcd03acbd68
5
+ SHA512:
6
+ metadata.gz: 43722030a8c3f2bc44b811365ea964674af519a6507f87deb757dcdf92f27c0a41828533aa6866e6f9c0c9df12182a2402389d8ccb1f1e652e1cca651185feef
7
+ data.tar.gz: 0c75f526477414bd6a8b439b02ef592272fbb02975007b8cc91c1d646ba021f7354b2a7a8c4f71dde11ef1c87eb88f9d531981da5c585bbebc9f7c12301944b6
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ coverage
2
+ *.gem
data/.rubocop.yml ADDED
@@ -0,0 +1,264 @@
1
+ require:
2
+ - rubocop-minitest
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 3.0
6
+ NewCops: disable
7
+
8
+ Layout/SpaceAroundMethodCallOperator:
9
+ Enabled: false
10
+
11
+ Layout/SpaceInLambdaLiteral:
12
+ Enabled: false
13
+
14
+ Layout/MultilineMethodCallIndentation:
15
+ Enabled: true
16
+ EnforcedStyle: indented
17
+
18
+ Layout/FirstArrayElementIndentation:
19
+ EnforcedStyle: consistent
20
+
21
+ Layout/SpaceInsideHashLiteralBraces:
22
+ Enabled: true
23
+
24
+ Layout/LineLength:
25
+ Max: 100
26
+ Exclude:
27
+ - "spec/**/*.rb"
28
+
29
+ Layout/HashAlignment:
30
+ Enabled: false
31
+
32
+ Lint/AmbiguousBlockAssociation:
33
+ Enabled: true
34
+ # because 'expect { foo }.to change { bar }' is fine
35
+ Exclude:
36
+ - "spec/**/*.rb"
37
+
38
+ Lint/BooleanSymbol:
39
+ Enabled: false
40
+
41
+ Lint/ConstantDefinitionInBlock:
42
+ Exclude:
43
+ - "spec/**/*.rb"
44
+
45
+ Lint/RaiseException:
46
+ Enabled: false
47
+
48
+ Lint/StructNewOverride:
49
+ Enabled: false
50
+
51
+ Lint/SuppressedException:
52
+ Exclude:
53
+ - "spec/spec_helper.rb"
54
+
55
+ Lint/LiteralAsCondition:
56
+ Exclude:
57
+ - "spec/**/*.rb"
58
+
59
+ Naming/PredicateName:
60
+ Enabled: false
61
+
62
+ Naming/FileName:
63
+ Exclude:
64
+ - "lib/*-*.rb"
65
+
66
+ Naming/MethodName:
67
+ Enabled: false
68
+
69
+ Naming/MethodParameterName:
70
+ Enabled: false
71
+
72
+ Naming/MemoizedInstanceVariableName:
73
+ Enabled: false
74
+
75
+ Metrics/MethodLength:
76
+ Enabled: false
77
+
78
+ Metrics/ClassLength:
79
+ Enabled: false
80
+
81
+ Metrics/BlockLength:
82
+ Enabled: false
83
+
84
+ Metrics/AbcSize:
85
+ Max: 25
86
+
87
+ Metrics/CyclomaticComplexity:
88
+ Enabled: true
89
+ Max: 12
90
+
91
+ Style/ExponentialNotation:
92
+ Enabled: false
93
+
94
+ Style/HashEachMethods:
95
+ Enabled: false
96
+
97
+ Style/HashTransformKeys:
98
+ Enabled: false
99
+
100
+ Style/HashTransformValues:
101
+ Enabled: false
102
+
103
+ Style/AccessModifierDeclarations:
104
+ Enabled: false
105
+
106
+ Style/Alias:
107
+ Enabled: true
108
+ EnforcedStyle: prefer_alias_method
109
+
110
+ Style/AsciiComments:
111
+ Enabled: false
112
+
113
+ Style/BlockDelimiters:
114
+ Enabled: false
115
+
116
+ Style/ClassAndModuleChildren:
117
+ Exclude:
118
+ - "spec/**/*.rb"
119
+
120
+ Style/ConditionalAssignment:
121
+ Enabled: false
122
+
123
+ Style/DateTime:
124
+ Enabled: false
125
+
126
+ Style/Documentation:
127
+ Enabled: false
128
+
129
+ Style/EachWithObject:
130
+ Enabled: false
131
+
132
+ Style/FormatString:
133
+ Enabled: false
134
+
135
+ Style/FormatStringToken:
136
+ Enabled: false
137
+
138
+ Style/GuardClause:
139
+ Enabled: false
140
+
141
+ Style/IfUnlessModifier:
142
+ Enabled: false
143
+
144
+ Style/Lambda:
145
+ Enabled: false
146
+
147
+ Style/LambdaCall:
148
+ Enabled: false
149
+
150
+ Style/ParallelAssignment:
151
+ Enabled: false
152
+
153
+ Style/RaiseArgs:
154
+ Enabled: false
155
+
156
+ Style/StabbyLambdaParentheses:
157
+ Enabled: false
158
+
159
+ Style/StringLiterals:
160
+ Enabled: true
161
+ EnforcedStyle: double_quotes
162
+ ConsistentQuotesInMultiline: false
163
+
164
+ Style/StringLiteralsInInterpolation:
165
+ Enabled: true
166
+ EnforcedStyle: double_quotes
167
+
168
+ Style/SymbolArray:
169
+ Exclude:
170
+ - "spec/**/*.rb"
171
+
172
+ Style/TrailingUnderscoreVariable:
173
+ Enabled: false
174
+
175
+ Style/MultipleComparison:
176
+ Enabled: false
177
+
178
+ Style/Next:
179
+ Enabled: false
180
+
181
+ Style/AccessorGrouping:
182
+ Enabled: false
183
+
184
+ Style/EmptyLiteral:
185
+ Enabled: false
186
+
187
+ Style/Semicolon:
188
+ Exclude:
189
+ - "spec/**/*.rb"
190
+
191
+ Style/HashAsLastArrayItem:
192
+ Exclude:
193
+ - "spec/**/*.rb"
194
+
195
+ Style/CaseEquality:
196
+ Exclude:
197
+ - "lib/dry/monads/**/*.rb"
198
+ - "lib/dry/struct/**/*.rb"
199
+ - "lib/dry/types/**/*.rb"
200
+ - "spec/**/*.rb"
201
+
202
+ Style/ExplicitBlockArgument:
203
+ Exclude:
204
+ - "lib/dry/types/**/*.rb"
205
+
206
+ Style/CombinableLoops:
207
+ Enabled: false
208
+
209
+ Style/EmptyElse:
210
+ Enabled: false
211
+
212
+ Style/DoubleNegation:
213
+ Enabled: false
214
+
215
+ Style/MultilineBlockChain:
216
+ Enabled: false
217
+
218
+ Style/NumberedParametersLimit:
219
+ Max: 2
220
+
221
+ Lint/UnusedBlockArgument:
222
+ Exclude:
223
+ - "spec/**/*.rb"
224
+
225
+ Lint/Debugger:
226
+ Exclude:
227
+ - "bin/console"
228
+
229
+ Lint/BinaryOperatorWithIdenticalOperands:
230
+ Exclude:
231
+ - "spec/**/*.rb"
232
+
233
+ Metrics/ParameterLists:
234
+ Exclude:
235
+ - "spec/**/*.rb"
236
+
237
+ Lint/EmptyBlock:
238
+ Exclude:
239
+ - "spec/**/*.rb"
240
+
241
+ Lint/EmptyFile:
242
+ Exclude:
243
+ - "spec/**/*.rb"
244
+
245
+ Lint/UselessMethodDefinition:
246
+ Exclude:
247
+ - "spec/**/*.rb"
248
+
249
+ Lint/SelfAssignment:
250
+ Enabled: false
251
+
252
+ Lint/EmptyClass:
253
+ Enabled: false
254
+
255
+ Naming/ConstantName:
256
+ Exclude:
257
+ - "spec/**/*.rb"
258
+
259
+ Naming/VariableNumber:
260
+ Exclude:
261
+ - "spec/**/*.rb"
262
+
263
+ Naming/BinaryOperatorParameterName:
264
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,91 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sigt (0.0.1)
5
+ dry-types (~> 1.7.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.2)
11
+ bigdecimal (3.1.7)
12
+ coderay (1.1.3)
13
+ concurrent-ruby (1.2.3)
14
+ docile (1.4.0)
15
+ dry-core (1.0.1)
16
+ concurrent-ruby (~> 1.0)
17
+ zeitwerk (~> 2.6)
18
+ dry-inflector (1.0.0)
19
+ dry-logic (1.5.0)
20
+ concurrent-ruby (~> 1.0)
21
+ dry-core (~> 1.0, < 2)
22
+ zeitwerk (~> 2.6)
23
+ dry-struct (1.6.0)
24
+ dry-core (~> 1.0, < 2)
25
+ dry-types (>= 1.7, < 2)
26
+ ice_nine (~> 0.11)
27
+ zeitwerk (~> 2.6)
28
+ dry-types (1.7.2)
29
+ bigdecimal (~> 3.0)
30
+ concurrent-ruby (~> 1.0)
31
+ dry-core (~> 1.0)
32
+ dry-inflector (~> 1.0)
33
+ dry-logic (~> 1.4)
34
+ zeitwerk (~> 2.6)
35
+ ice_nine (0.11.2)
36
+ json (2.7.1)
37
+ language_server-protocol (3.17.0.3)
38
+ method_source (1.0.0)
39
+ minitest (5.22.3)
40
+ parallel (1.24.0)
41
+ parser (3.3.0.5)
42
+ ast (~> 2.4.1)
43
+ racc
44
+ pry (0.14.2)
45
+ coderay (~> 1.1)
46
+ method_source (~> 1.0)
47
+ racc (1.7.3)
48
+ rainbow (3.1.1)
49
+ regexp_parser (2.9.0)
50
+ rexml (3.2.6)
51
+ rubocop (1.62.1)
52
+ json (~> 2.3)
53
+ language_server-protocol (>= 3.17.0)
54
+ parallel (~> 1.10)
55
+ parser (>= 3.3.0.2)
56
+ rainbow (>= 2.2.2, < 4.0)
57
+ regexp_parser (>= 1.8, < 3.0)
58
+ rexml (>= 3.2.5, < 4.0)
59
+ rubocop-ast (>= 1.31.1, < 2.0)
60
+ ruby-progressbar (~> 1.7)
61
+ unicode-display_width (>= 2.4.0, < 3.0)
62
+ rubocop-ast (1.31.2)
63
+ parser (>= 3.3.0.4)
64
+ rubocop-minitest (0.35.0)
65
+ rubocop (>= 1.61, < 2.0)
66
+ rubocop-ast (>= 1.31.1, < 2.0)
67
+ ruby-progressbar (1.13.0)
68
+ simplecov (0.22.0)
69
+ docile (~> 1.1)
70
+ simplecov-html (~> 0.11)
71
+ simplecov_json_formatter (~> 0.1)
72
+ simplecov-html (0.12.3)
73
+ simplecov_json_formatter (0.1.4)
74
+ unicode-display_width (2.5.0)
75
+ zeitwerk (2.6.13)
76
+
77
+ PLATFORMS
78
+ arm64-darwin-22
79
+ ruby
80
+
81
+ DEPENDENCIES
82
+ dry-struct (~> 1.6.0)
83
+ minitest (~> 5.22.3)
84
+ pry (~> 0.14.2)
85
+ rubocop (~> 1.62.1)
86
+ rubocop-minitest (~> 0.35.0)
87
+ sigt!
88
+ simplecov (~> 0.22.0)
89
+
90
+ BUNDLED WITH
91
+ 2.5.3
data/Makefile ADDED
@@ -0,0 +1,16 @@
1
+ .PHONY: *
2
+
3
+ default: test
4
+
5
+ build:
6
+ rm -f *.gem
7
+ gem build sigt.gemspec
8
+
9
+ publish: build
10
+ gem push *.gem
11
+
12
+ console:
13
+ irb -Ilib:spec -rspec_helper.rb
14
+
15
+ test:
16
+ ruby -Ilib:spec -rpry spec/*_spec.rb
data/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # SigT
2
+
3
+ ![](https://images.unsplash.com/photo-1622966591413-81d31b41c8a3?w=600&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8NTV8fHNpZ25hdHVyZXxlbnwwfHwwfHx8MA%3D%3D)
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ gem install sigt
9
+ ```
10
+
11
+ ## Example
12
+
13
+ ### Function composition
14
+
15
+ ```ruby
16
+ module Types
17
+ include Dry.Types()
18
+ end
19
+
20
+ AgeHash = Types::Hash.schema(age: Types::Integer, name: Types::String)
21
+ FinalHash = AgeHash & Types::Hash.schema(created_at: Types.Instance(Time))
22
+
23
+ TO_INTEGER = -> (x) { x.to_i }
24
+ TO_JSON = -> (x) { x.to_json }
25
+
26
+ hash = SigT[Types::Integer => AgeHash] { |age| Hash[age: age, name: "poe"] }
27
+
28
+ with_date = SigT[AgeHash => FinalHash] do |hash|
29
+ hash.update(created_at: Time.now.utc)
30
+ end
31
+
32
+ fn = TO_INTEGER >> hash >> with_date >> TO_JSON
33
+ fn["42"]
34
+ #=> "{\"age\":42,\"name\":\"poe\",\"created_at\":\"2024-03-22 22:28:26 UTC\"}"
35
+ ```
36
+
37
+ ### Dry::Types
38
+
39
+ ```ruby
40
+ sig = SigT[Types::String => Types::Hash.schema(name: Types::String)]
41
+
42
+ fn = sig[] { |input| Hash[name: input] }
43
+
44
+ fn[1]
45
+ #=> SigT::InputError: 1 violates constraints (type?(String, 1) failed)
46
+
47
+ fn["elcuervo"]
48
+ #=> {:name=>"elcuervo"}
49
+ ```
50
+
51
+ ### Dry::Struct
52
+
53
+ ```ruby
54
+ class TestInput < Dry::Struct
55
+ attribute :url, SigT::Types::String
56
+ attribute? :potato_count, SigT::Types::Integer
57
+ end
58
+
59
+ class TestOutput < Dry::Struct
60
+ attribute :complexity, SigT::Types::Float
61
+ attribute? :url, SigT::Types::String
62
+ end
63
+
64
+ fn = SigT[TestInput => TestOutput] do |input|
65
+ TestOutput.new(complexity: 0.4, url: input.url)
66
+ end
67
+
68
+ fn.call(TestInput.new(url: "test"))
69
+ # => #<TestOutput complexity=0.4 url="test">
70
+ ```
data/flake.lock ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "nodes": {
3
+ "flake-utils": {
4
+ "inputs": {
5
+ "systems": "systems"
6
+ },
7
+ "locked": {
8
+ "lastModified": 1710146030,
9
+ "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
10
+ "owner": "numtide",
11
+ "repo": "flake-utils",
12
+ "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
13
+ "type": "github"
14
+ },
15
+ "original": {
16
+ "owner": "numtide",
17
+ "repo": "flake-utils",
18
+ "type": "github"
19
+ }
20
+ },
21
+ "nixpkgs": {
22
+ "locked": {
23
+ "lastModified": 1710889954,
24
+ "narHash": "sha256-Pr6F5Pmd7JnNEMHHmspZ0qVqIBVxyZ13ik1pJtm2QXk=",
25
+ "owner": "nixos",
26
+ "repo": "nixpkgs",
27
+ "rev": "7872526e9c5332274ea5932a0c3270d6e4724f3b",
28
+ "type": "github"
29
+ },
30
+ "original": {
31
+ "owner": "nixos",
32
+ "ref": "nixpkgs-unstable",
33
+ "repo": "nixpkgs",
34
+ "type": "github"
35
+ }
36
+ },
37
+ "root": {
38
+ "inputs": {
39
+ "flake-utils": "flake-utils",
40
+ "nixpkgs": "nixpkgs"
41
+ }
42
+ },
43
+ "systems": {
44
+ "locked": {
45
+ "lastModified": 1681028828,
46
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+ "owner": "nix-systems",
48
+ "repo": "default",
49
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+ "type": "github"
51
+ },
52
+ "original": {
53
+ "owner": "nix-systems",
54
+ "repo": "default",
55
+ "type": "github"
56
+ }
57
+ }
58
+ },
59
+ "root": "root",
60
+ "version": 7
61
+ }
data/flake.nix ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ inputs = {
3
+ nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
4
+ flake-utils.url = "github:numtide/flake-utils";
5
+ };
6
+
7
+ outputs = { self, nixpkgs, flake-utils }:
8
+ flake-utils.lib.eachDefaultSystem (system:
9
+ let
10
+ pkgs = import nixpkgs { inherit system; };
11
+ in
12
+ {
13
+ devShells.default = pkgs.mkShell {
14
+ buildInputs = with pkgs; [
15
+ ruby_3_3
16
+ ];
17
+ };
18
+ });
19
+ }
data/lib/sigt.rb ADDED
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The SigT class provides functionality for defining and enforcing type signatures
4
+ # on method inputs and outputs using the dry-types gem. It allows for the dynamic
5
+ # validation of method arguments and return values against specified type constraints.
6
+ #
7
+ class SigT
8
+ module Types
9
+ include Dry.Types()
10
+
11
+ Type = Types.Instance(Dry::Types::Type)
12
+ Signature = Types::Hash
13
+ .map(Type, Type)
14
+ .constrained(max_size: 1)
15
+ end
16
+
17
+ Error = Class.new(StandardError)
18
+ SignatureError = Class.new(Error)
19
+ InputError = Class.new(Error)
20
+ OutputError = Class.new(Error)
21
+
22
+ class << self
23
+ # Defines a signature for input and output types and wraps the provided block with type
24
+ # validation checks.
25
+ # @param signature [Hash] A hash representing the input and output types.
26
+ # @yield [input] The block to be executed.
27
+ # @yieldparam input [Object] The input object to be processed.
28
+ # @yieldreturn [Object] The result of the block execution, which will be validated against the
29
+ # output type.
30
+ # @raise [SignatureError] If the signature does not conform to the expected structure or
31
+ # constraints.
32
+ # @raise [InputError] If the input object does not match the expected type.
33
+ # @raise [OutputError] If the output object does not match the expected type.
34
+ # @return [Proc] A proc that represents the wrapped block, which validates input and output
35
+ # types.
36
+ #
37
+ def [](signature, &block)
38
+ Types::Signature[signature]
39
+ .flatten
40
+ .then do |input, output|
41
+ return sandwich(input, block, output) if block
42
+ -> (&fn) { sandwich(input, fn, output) }
43
+ end
44
+ rescue Dry::Types::ConstraintError => e
45
+ raise SignatureError, "Signature can only have 1 Dry::Type => Dry::Type compatible objects"
46
+ end
47
+
48
+ private
49
+
50
+ # Creates a sandwiched function that validates the input, executes the function, and then
51
+ # validates the output.
52
+ # @param input [Dry::Types::Type] The expected type of the input.
53
+ # @param fn [Proc] The function to execute between type checks.
54
+ # @param output [Dry::Types::Type] The expected type of the output.
55
+ # @return [Proc] A proc that takes an input, validates it, executes the function, and validates
56
+ # the output.
57
+ #
58
+ def sandwich(input, fn, output)
59
+ wrap_or_raise(input, InputError) >> fn >> wrap_or_raise(output, OutputError)
60
+ end
61
+
62
+ # Wraps a block with type validation, raising an error if the validation fails.
63
+ # @param type [Dry::Types::Type] The type to validate against.
64
+ # @param error [Class] The error class to be raised if validation fails.
65
+ # @return [Proc] A proc that represents the wrapped block, which performs type validation.
66
+ #
67
+ def wrap_or_raise(type, error)
68
+ -> (input) do
69
+ type[input]
70
+ rescue StandardError => e
71
+ raise error, e.message
72
+ end
73
+ end
74
+ end
75
+ end
data/sigt.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "sigt"
5
+ s.version = "0.0.1"
6
+ s.summary = "Signature Types"
7
+ s.authors = ["elcuervo"]
8
+ s.licenses = %w[MIT]
9
+ s.email = ["elcuervo@elcuervo.net"]
10
+ s.homepage = "http://github.com/elcuervo/sigt"
11
+ s.files = `git ls-files`.split("\n")
12
+ s.test_files = `git ls-files test`.split("\n")
13
+
14
+ s.add_dependency("dry-types", "~> 1.7.2")
15
+
16
+ s.add_development_dependency("dry-struct", "~> 1.6.0")
17
+ s.add_development_dependency("minitest", "~> 5.22.3")
18
+ s.add_development_dependency("pry", "~> 0.14.2")
19
+ s.add_development_dependency("simplecov", "~> 0.22.0")
20
+ s.add_development_dependency("rubocop", "~> 1.62.1")
21
+ s.add_development_dependency("rubocop-minitest", "~> 0.35.0")
22
+ end
data/spec/sigt_spec.rb ADDED
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe SigT do
6
+ describe "simple definition" do
7
+ let(:fn) do
8
+ SigT[SigT::Types::String => SigT::Types::Integer] do |params|
9
+ params.to_i + 1
10
+ end
11
+ end
12
+
13
+ it "defines an input/output signature" do
14
+ assert_equal fn["1"], 2
15
+ end
16
+
17
+ it "checks the input" do
18
+ assert_raises(SigT::InputError) { fn[1] }
19
+ end
20
+
21
+ it "checks output input" do
22
+ bad = SigT[SigT::Types::String => SigT::Types::Hash] do |input|
23
+ input
24
+ end
25
+
26
+ assert_raises(SigT::OutputError) { bad["1"] }
27
+ end
28
+
29
+ it "multiline" do
30
+ sig = SigT[SigT::Types::String => SigT::Types::Hash.schema(name: SigT::Types::String)]
31
+ fn = sig[] { |input| Hash[name: input] }
32
+
33
+ assert_equal fn["raven"], { name: "raven" }
34
+ end
35
+ end
36
+
37
+ describe "complex definition" do
38
+ class TestInput < Dry::Struct
39
+ attribute :url, SigT::Types::String
40
+ attribute? :potato_count, SigT::Types::Integer
41
+ end
42
+
43
+ class TestOutput < Dry::Struct
44
+ attribute :complexity, SigT::Types::Float
45
+ attribute? :url, SigT::Types::String
46
+ end
47
+
48
+ let(:fn) do
49
+ SigT[TestInput => TestOutput] do |input|
50
+ TestOutput.new(complexity: 0.4, url: input.url)
51
+ end
52
+ end
53
+
54
+ it "defines an input/output signature" do
55
+ input = TestInput.new(url: "test")
56
+
57
+ assert_equal fn[input].class, TestOutput
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "simplecov"
4
+
5
+ SimpleCov.start
6
+
7
+ require "minitest/autorun"
8
+
9
+ require "dry/types"
10
+ require "dry/struct"
11
+ require "sigt"
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sigt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - elcuervo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 1980-01-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-types
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.7.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.7.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-struct
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.6.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 5.22.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 5.22.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.14.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.14.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.22.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.22.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.62.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.62.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.35.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.35.0
111
+ description:
112
+ email:
113
+ - elcuervo@elcuervo.net
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rubocop.yml"
120
+ - Gemfile
121
+ - Gemfile.lock
122
+ - Makefile
123
+ - README.md
124
+ - flake.lock
125
+ - flake.nix
126
+ - lib/sigt.rb
127
+ - sigt.gemspec
128
+ - spec/sigt_spec.rb
129
+ - spec/spec_helper.rb
130
+ homepage: http://github.com/elcuervo/sigt
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubygems_version: 3.5.6
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: Signature Types
153
+ test_files: []