mangrove 0.3.0 → 0.4.0
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/.rubocop.yml +10 -0
- data/README.md +52 -12
- data/Rakefile +2 -2
- data/lib/mangrove/control_flow/rewriter.rb +5 -2
- data/lib/mangrove/result.rb +6 -16
- data/lib/mangrove/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06e20e8a9945c52ddba260f01fa12a7f8e65fda55fe2a369f85eb296b428eeb7
|
4
|
+
data.tar.gz: 524eba3f2d942063c597568e7d432f18cff9f6e5b85efc5eeadb3d055eaaac46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88cbb663b866dfd8fb559adc76b847a8501e1d96c237e0ef919c339381f142f4ce7a91482770bd239e2f68588793171c900e9b87a57f50f0c290d9982f944b2c
|
7
|
+
data.tar.gz: 9c1b5d530382de4eeeeb2cf20e0a18abd184a0dbd10cbf66fef190f1d897026863449afa56fa0de4d34cb594659d00a93e5eab2ae6ec548050dbcb3ce20321d2
|
data/.rubocop.yml
CHANGED
@@ -9,6 +9,9 @@ Layout/FirstArrayElementIndentation:
|
|
9
9
|
Layout/LineLength:
|
10
10
|
Enabled: false
|
11
11
|
|
12
|
+
Layout/MultilineMethodCallIndentation:
|
13
|
+
EnforcedStyle: indented
|
14
|
+
|
12
15
|
Metrics/AbcSize:
|
13
16
|
Enabled: false
|
14
17
|
|
@@ -27,6 +30,13 @@ Metrics/ModuleLength:
|
|
27
30
|
Naming/VariableNumber:
|
28
31
|
EnforcedStyle: snake_case
|
29
32
|
|
33
|
+
Style/BlockDelimiters:
|
34
|
+
EnforcedStyle: always_braces
|
35
|
+
AllowedMethods:
|
36
|
+
- describe
|
37
|
+
- context
|
38
|
+
- it
|
39
|
+
|
30
40
|
Style/Documentation:
|
31
41
|
Enabled: false
|
32
42
|
|
data/README.md
CHANGED
@@ -1,5 +1,35 @@
|
|
1
1
|
# Mangrove
|
2
|
-
Mangrove provides utility
|
2
|
+
Mangrove provides type utility to use with Sorbet.
|
3
|
+
|
4
|
+
You can do something like this with the gem.
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
class MyClass
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
include Mangrove::ControlFlow::Handler
|
11
|
+
|
12
|
+
sig { params(numbers: T::Enumerable[Integer]).returns(Mangrove::Result[T::Array[Integer], String]) }
|
13
|
+
def divide_arguments_by_3(numbers)
|
14
|
+
divided_nubmers = numbers
|
15
|
+
.map { |number|
|
16
|
+
if number % 3 == 0
|
17
|
+
Mangrove::Result::Ok.new(number / 3)
|
18
|
+
else
|
19
|
+
Mangrove::Result::Err.new("number #{number} is not divisible by 3")
|
20
|
+
end
|
21
|
+
}
|
22
|
+
.map(&:unwrap!)
|
23
|
+
|
24
|
+
Mangrove::Result::Ok.new(divided_nubmers)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
expect(MyClass.new.divide_arguments_by_3([3, 4, 6])).to eq Mangrove::Result::Err.new("number 4 is not divisible by 3")
|
29
|
+
expect(MyClass.new.divide_arguments_by_3([3, 6, 9])).to eq Mangrove::Result::Ok.new([1, 2, 3])
|
30
|
+
```
|
31
|
+
|
32
|
+
Other examples are available at `spec/**/**_spec.rb`.
|
3
33
|
|
4
34
|
## Features
|
5
35
|
Most features are not implemented.
|
@@ -10,24 +40,34 @@ Most features are not implemented.
|
|
10
40
|
- [x] Auto propagation like Rust's `?` (formerly `try!`)
|
11
41
|
- [ ] Builder type (Not implemented)
|
12
42
|
- [ ] Auto Implementation
|
13
|
-
|
14
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/mangrove`. To experiment with that code, run `bin/console` for an interactive prompt.
|
43
|
+
- [ ] TODO
|
15
44
|
|
16
45
|
## Installation
|
17
46
|
|
18
|
-
|
19
|
-
|
20
|
-
|
47
|
+
```
|
48
|
+
bundle add mangrove
|
49
|
+
```
|
21
50
|
|
22
|
-
|
51
|
+
## Usage
|
23
52
|
|
24
|
-
|
53
|
+
see `spec/**/**_spec.rb`.
|
25
54
|
|
26
|
-
|
55
|
+
```ruby
|
56
|
+
Mangrove::Result[OkType, ErrType]
|
57
|
+
Mangrove::Result::Ok[OkType, ErrType]
|
58
|
+
Mangrove::Result::Err[OkType, ErrType]
|
59
|
+
Mangrove::Option[InnerType]
|
60
|
+
Mangrove::Option::Some[InnerType]
|
61
|
+
Mangrove::Option::None[InnerType]
|
27
62
|
|
28
|
-
|
63
|
+
my_ok = Result::Ok.new("my value")
|
64
|
+
my_err = Result::Err.new("my err")
|
65
|
+
my_some = Option::Some.new(1234)
|
66
|
+
my_none = Option::None.new
|
29
67
|
|
30
|
-
|
68
|
+
# Including this Module into your class appends rescue clause into its methods. Results to `Option#unwrap!` and `Result#unwrap!` propagates to calling method like Ruet's `?` operator.
|
69
|
+
include Mangrove::ControlFlow::Handler
|
70
|
+
```
|
31
71
|
|
32
72
|
## Commands
|
33
73
|
```
|
@@ -53,4 +93,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
53
93
|
|
54
94
|
## Contributing
|
55
95
|
|
56
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
96
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/kazzix14/mangrove.
|
data/Rakefile
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
require "bundler/gem_tasks"
|
4
4
|
require "rake/testtask"
|
5
5
|
|
6
|
-
task
|
6
|
+
task(:check) {
|
7
7
|
system("bundle exec ordinare --check") &&
|
8
8
|
system("bundle exec rubocop -DESP") &&
|
9
9
|
system("bundle exec tapioca check-shims") &&
|
10
10
|
system("bundle exec srb typecheck") &&
|
11
11
|
system("bundle exec rspec -f d")
|
12
|
-
|
12
|
+
}
|
13
13
|
|
14
14
|
task default: :check
|
@@ -127,7 +127,7 @@ module Mangrove
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def rescue_body_node
|
130
|
-
control_flow =
|
130
|
+
control_flow = Mangrove::ControlFlow::ControlSignal
|
131
131
|
|
132
132
|
::Parser::AST::Node.new(:resbody, [
|
133
133
|
::Parser::AST::Node.new(:array, [
|
@@ -143,7 +143,10 @@ module Mangrove
|
|
143
143
|
:Err
|
144
144
|
]),
|
145
145
|
:new,
|
146
|
-
::Parser::AST::Node.new(:
|
146
|
+
::Parser::AST::Node.new(:send, [
|
147
|
+
::Parser::AST::Node.new(:lvar, [:exception]),
|
148
|
+
:inner_value
|
149
|
+
])
|
147
150
|
])
|
148
151
|
])
|
149
152
|
end
|
data/lib/mangrove/result.rb
CHANGED
@@ -113,12 +113,12 @@ module Mangrove
|
|
113
113
|
|
114
114
|
sig { override.returns(OkType) }
|
115
115
|
def unwrap!
|
116
|
-
raise Result::ControlSignal,
|
116
|
+
raise Result::ControlSignal, @inner
|
117
117
|
end
|
118
118
|
|
119
119
|
sig { override.params(message: String).returns(OkType) }
|
120
120
|
def expect!(message)
|
121
|
-
raise Result::ControlSignal,
|
121
|
+
raise Result::ControlSignal, message
|
122
122
|
end
|
123
123
|
|
124
124
|
sig { override.returns(T::Boolean) }
|
@@ -127,16 +127,12 @@ module Mangrove
|
|
127
127
|
sig { override.returns(T::Boolean) }
|
128
128
|
def err? = true
|
129
129
|
|
130
|
-
sig
|
131
|
-
override.params(_block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType])
|
132
|
-
end
|
130
|
+
sig { override.params(_block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
133
131
|
def map_ok(&_block)
|
134
132
|
self
|
135
133
|
end
|
136
134
|
|
137
|
-
sig
|
138
|
-
override.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType])
|
139
|
-
end
|
135
|
+
sig { override.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
140
136
|
def map_err(&block)
|
141
137
|
block.call(@inner)
|
142
138
|
end
|
@@ -157,16 +153,10 @@ module Mangrove
|
|
157
153
|
sig { abstract.params(message: String).returns(OkType) }
|
158
154
|
def expect!(message); end
|
159
155
|
|
160
|
-
sig
|
161
|
-
abstract.params(block: T.proc.params(this: OkType).returns(Result[OkType,
|
162
|
-
ErrType])).returns(Result[OkType, ErrType])
|
163
|
-
end
|
156
|
+
sig { abstract.params(block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
164
157
|
def map_ok(&block); end
|
165
158
|
|
166
|
-
sig
|
167
|
-
abstract.params(block: T.proc.params(this: ErrType).returns(Result[OkType,
|
168
|
-
ErrType])).returns(Result[OkType, ErrType])
|
169
|
-
end
|
159
|
+
sig { abstract.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
170
160
|
def map_err(&block); end
|
171
161
|
end
|
172
162
|
end
|
data/lib/mangrove/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mangrove
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuma Murata
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sorbet-runtime
|