mangrove 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d9363cc1b8f639fb866ae374f0e64ffe380d3b35b169f3d62311e2a59580736
4
- data.tar.gz: d467281c91693bbb7ba35996ce578e5af4e0698268603973e84340317fa6e677
3
+ metadata.gz: 06e20e8a9945c52ddba260f01fa12a7f8e65fda55fe2a369f85eb296b428eeb7
4
+ data.tar.gz: 524eba3f2d942063c597568e7d432f18cff9f6e5b85efc5eeadb3d055eaaac46
5
5
  SHA512:
6
- metadata.gz: ebe32cf0d3682642244a3a44ee132dab4a3cf09c79a67f4e4638a5e262b918a8510da53f9600cc1b86c152949923b6c4503ed62175f9bce2579646401e631f50
7
- data.tar.gz: ebcef49659e1251716a7da1d111eb691b4468d57ac8ab073775a7f6719794ac20f09b37e6619b30200432cca068f99818869d891eb3fb52620fd2556875011ab
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 types to use with Sorbet
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
- TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
19
-
20
- Install the gem and add to the application's Gemfile by executing:
47
+ ```
48
+ bundle add mangrove
49
+ ```
21
50
 
22
- $ bundle add UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
51
+ ## Usage
23
52
 
24
- If bundler is not being used to manage dependencies, install the gem by executing:
53
+ see `spec/**/**_spec.rb`.
25
54
 
26
- $ gem install UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
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
- ## Usage
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
- TODO: Write usage instructions here
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/[USERNAME]/mangrove.
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 :check do
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
- end
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 = StandardError
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(:lvar, [:exception])
146
+ ::Parser::AST::Node.new(:send, [
147
+ ::Parser::AST::Node.new(:lvar, [:exception]),
148
+ :inner_value
149
+ ])
147
150
  ])
148
151
  ])
149
152
  end
@@ -47,7 +47,7 @@ module Mangrove
47
47
  end
48
48
 
49
49
  sig { returns(OkType) }
50
- def unwrap
50
+ def ok_inner
51
51
  @inner
52
52
  end
53
53
 
@@ -106,14 +106,19 @@ module Mangrove
106
106
  end
107
107
  end
108
108
 
109
+ sig { returns(ErrType) }
110
+ def err_inner
111
+ @inner
112
+ end
113
+
109
114
  sig { override.returns(OkType) }
110
115
  def unwrap!
111
- raise Result::ControlSignal, Result::Err.new("called `Result#unwrap!` on an `Err` value: #{self}")
116
+ raise Result::ControlSignal, @inner
112
117
  end
113
118
 
114
119
  sig { override.params(message: String).returns(OkType) }
115
120
  def expect!(message)
116
- raise Result::ControlSignal, Result::Err.new(message)
121
+ raise Result::ControlSignal, message
117
122
  end
118
123
 
119
124
  sig { override.returns(T::Boolean) }
@@ -122,16 +127,12 @@ module Mangrove
122
127
  sig { override.returns(T::Boolean) }
123
128
  def err? = true
124
129
 
125
- sig do
126
- override.params(_block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType])
127
- end
130
+ sig { override.params(_block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
128
131
  def map_ok(&_block)
129
132
  self
130
133
  end
131
134
 
132
- sig do
133
- override.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType])
134
- end
135
+ sig { override.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
135
136
  def map_err(&block)
136
137
  block.call(@inner)
137
138
  end
@@ -152,16 +153,10 @@ module Mangrove
152
153
  sig { abstract.params(message: String).returns(OkType) }
153
154
  def expect!(message); end
154
155
 
155
- sig do
156
- abstract.params(block: T.proc.params(this: OkType).returns(Result[OkType,
157
- ErrType])).returns(Result[OkType, ErrType])
158
- end
156
+ sig { abstract.params(block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
159
157
  def map_ok(&block); end
160
158
 
161
- sig do
162
- abstract.params(block: T.proc.params(this: ErrType).returns(Result[OkType,
163
- ErrType])).returns(Result[OkType, ErrType])
164
- end
159
+ sig { abstract.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
165
160
  def map_err(&block); end
166
161
  end
167
162
  end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Mangrove
5
- VERSION = "0.2.0"
5
+ VERSION = "0.4.0"
6
6
  end
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.2.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-25 00:00:00.000000000 Z
11
+ date: 2023-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sorbet-runtime