not_monads 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2e9974bab26e9af1e3ec8fad57c6b72b706bcbc1933fed1ec606050103252bb3
4
+ data.tar.gz: 560ddae392216cc701cc94281471084c22dd9042f44e561b80cfe7a76fb98f36
5
+ SHA512:
6
+ metadata.gz: bf6b4273f3e41abd484a1022fb1475431b73dc3ee60a0c7df5ecca9939e55bb8e40bcae2b05f8989cb2315200fd5b426ebd7f9d51b907c1961121f00ef4dc5b4
7
+ data.tar.gz: e658304d770247652411c4855f670d367119916dd132d720ff57a9a374a67c4adac16021adcbf6c8c38b0c65e24930366d56c715af04fc4f307488a21d4eefac
@@ -0,0 +1,52 @@
1
+ // For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+ // README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-docker-compose
3
+ {
4
+ "name": "not_monads devcontainer",
5
+
6
+ // Update the 'dockerComposeFile' list if you have more compose files or use different names.
7
+ // The .devcontainer/docker-compose.yml file contains any overrides you need/want to make.
8
+ "dockerComposeFile": [
9
+ "../docker-compose.yml",
10
+ "docker-compose.yml"
11
+ ],
12
+
13
+ // The 'service' property is the name of the service for the container that VS Code should
14
+ // use. Update this value and .devcontainer/docker-compose.yml to the real service name.
15
+ "service": "not_monads",
16
+
17
+ // The optional 'workspaceFolder' property is the path VS Code should open by default when
18
+ // connected. This is typically a file mount in .devcontainer/docker-compose.yml
19
+ // "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}"
20
+ "workspaceFolder": "/app",
21
+ "customizations": {
22
+ "vscode": {
23
+ "extensions": [
24
+ "ms-azuretools.vscode-docker",
25
+ "EditorConfig.EditorConfig",
26
+ "eamodio.gitlens",
27
+ "Shopify.ruby-extensions-pack"
28
+ ]
29
+ }
30
+ }
31
+
32
+ // Features to add to the dev container. More info: https://containers.dev/features.
33
+ // "features": {},
34
+
35
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
36
+ // "forwardPorts": [],
37
+
38
+ // Uncomment the next line if you want start specific services in your Docker Compose config.
39
+ // "runServices": [],
40
+
41
+ // Uncomment the next line if you want to keep your containers running after VS Code shuts down.
42
+ // "shutdownAction": "none",
43
+
44
+ // Uncomment the next line to run commands after the container is created.
45
+ // "postCreateCommand": "cat /etc/os-release",
46
+
47
+ // Configure tool-specific properties.
48
+ // "customizations": {},
49
+
50
+ // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root.
51
+ // "remoteUser": "devcontainer"
52
+ }
@@ -0,0 +1,26 @@
1
+ version: '3.4'
2
+ services:
3
+ # Update this to the name of the service you want to work with in your docker-compose.yml file
4
+ not_monads:
5
+ # Uncomment if you want to override the service's Dockerfile to one in the .devcontainer
6
+ # folder. Note that the path of the Dockerfile and context is relative to the *primary*
7
+ # docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile"
8
+ # array). The sample below assumes your primary file is in the root of your project.
9
+ #
10
+ # build:
11
+ # context: .
12
+ # dockerfile: .devcontainer/Dockerfile
13
+
14
+ # volumes:
15
+ # # Update this to wherever you want VS Code to mount the folder of your project
16
+ # - ..:/workspaces:cached
17
+
18
+ # Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust.
19
+ # cap_add:
20
+ # - SYS_PTRACE
21
+ # security_opt:
22
+ # - seccomp:unconfined
23
+
24
+ # Overrides default command so things don't shut down after the process ends.
25
+ command: /bin/sh -c "while sleep 1000; do :; done"
26
+
data/.dockerignore ADDED
@@ -0,0 +1,25 @@
1
+ **/.classpath
2
+ **/.dockerignore
3
+ **/.env
4
+ **/.git
5
+ **/.gitignore
6
+ **/.project
7
+ **/.settings
8
+ **/.toolstarget
9
+ **/.vs
10
+ **/.vscode
11
+ **/*.*proj.user
12
+ **/*.dbmdl
13
+ **/*.jfm
14
+ **/bin
15
+ **/charts
16
+ **/docker-compose*
17
+ **/compose*
18
+ **/Dockerfile*
19
+ **/node_modules
20
+ **/npm-debug.log
21
+ **/obj
22
+ **/secrets.dev.yaml
23
+ **/values.dev.yaml
24
+ LICENSE
25
+ README.md
data/.editorconfig ADDED
@@ -0,0 +1,12 @@
1
+ # EditorConfig is awesome: https://EditorConfig.org
2
+
3
+ # top-most EditorConfig file
4
+ root = true
5
+
6
+ [*]
7
+ indent_style = space
8
+ indent_size = 2
9
+ end_of_line = lf
10
+ charset = utf-8
11
+ trim_trailing_whitespace = true
12
+ insert_final_newline = true
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ require:
2
+ - rubocop-rake
3
+ - rubocop-rspec
4
+ - rubocop-performance
5
+ - rubocop-thread_safety
6
+
7
+ AllCops:
8
+ TargetRubyVersion: 3.0
9
+ NewCops: enable
10
+
11
+ Style/Documentation:
12
+ Enabled: false
13
+
14
+ RSpec/MultipleExpectations:
15
+ Max: 4
16
+
17
+ Style/CaseEquality:
18
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2023-12-30
4
+
5
+ - Initial release
data/Dockerfile ADDED
@@ -0,0 +1,18 @@
1
+ FROM ruby:3.3-alpine
2
+
3
+ LABEL Name=not_monads Version=0.1.0
4
+
5
+ RUN apk add --update git
6
+
7
+ # throw errors if Gemfile has been modified since Gemfile.lock
8
+ # RUN bundle config --global frozen 1
9
+
10
+ WORKDIR /app
11
+
12
+ COPY Gemfile Gemfile.lock not_monads.gemspec ./
13
+ COPY lib/not_monads/version.rb lib/not_monads/version.rb
14
+ RUN bundle install
15
+
16
+ COPY . /app
17
+
18
+ # CMD ["ruby", "serviceobjects.rb"]
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023 kolas
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # NotMonads
2
+
3
+ Simple copy of [dry-monads](https://github.com/dry-rb/dry-monads) do monads, it implements only mixin for your service object and Success/Failure result object.
4
+
5
+ ## Installation
6
+
7
+ Install the gem and add to the application's Gemfile by executing:
8
+
9
+ $ bundle add not_monads
10
+
11
+ or add to Gemfile
12
+
13
+ gem 'not_monads'
14
+
15
+ If bundler is not being used to manage dependencies, install the gem by executing:
16
+
17
+ $ gem install not_monads
18
+
19
+ ## Usage
20
+
21
+ Add module to your class with prepend:
22
+
23
+ ```
24
+ class CreateUser
25
+ prepend NotMonads::Do[:call]
26
+
27
+ def call(params)
28
+ do_something validate(params)
29
+ user = do_something save(params)
30
+ Success(user)
31
+ end
32
+
33
+ private
34
+
35
+ def validate(params)
36
+ Success() || Failure(:error)
37
+ end
38
+
39
+ def save(params)
40
+ Success(user) || Failure(errors)
41
+ end
42
+ end
43
+ end
44
+ ```
45
+
46
+ Prepend with a module call with array of method names in square brackets. (`prepend NotMonads::Do[:call, :step1, :step3]`) Use method `do_something` to verify result, just like dry-monads with `yield` (`do_something` is a temporary method name, idk how to name it better yet)
47
+
48
+
49
+ ## Development
50
+
51
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
52
+
53
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
54
+
55
+ ## License
56
+
57
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require 'rubocop/rake_task'
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,15 @@
1
+ version: '3.4'
2
+
3
+ services:
4
+ not_monads:
5
+ image: not_monads
6
+ build:
7
+ context: .
8
+ dockerfile: ./Dockerfile
9
+ container_name: not_monads
10
+ volumes:
11
+ - .:/app:cached
12
+ - bundle:/usr/local/bundle
13
+
14
+ volumes:
15
+ bundle:
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'result'
4
+
5
+ module NotMonads
6
+ module Do
7
+ module MixinInstance
8
+ # rubocop:disable Naming/MethodName
9
+ def Success(value = nil)
10
+ NotMonads::Result::Success.new(value)
11
+ end
12
+
13
+ def Failure(value = nil)
14
+ NotMonads::Result::Failure.new(value)
15
+ end
16
+ # rubocop:enable Naming/MethodName
17
+
18
+ def do_something(result)
19
+ return result.success if result.success?
20
+
21
+ halt(result)
22
+ end
23
+
24
+ def halt(result)
25
+ raise Halt, result
26
+ end
27
+ end
28
+
29
+ class Halt < StandardError
30
+ attr_reader :result
31
+
32
+ def initialize(result)
33
+ super()
34
+ @result = result
35
+ end
36
+ end
37
+
38
+ class << self
39
+ def [](*methods)
40
+ Module.new do
41
+ methods.each do |method|
42
+ define_method(method) do |*args, **kwargs, &block|
43
+ super(*args, **kwargs, &block)
44
+ rescue Halt => e
45
+ e.result
46
+ end
47
+ end
48
+
49
+ include MixinInstance
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotMonads
4
+ class Result
5
+ attr_reader :success, :failure
6
+
7
+ class Success < Result
8
+ def initialize(value)
9
+ super()
10
+ @success = value
11
+ end
12
+
13
+ def failure?
14
+ false
15
+ end
16
+
17
+ def success?
18
+ true
19
+ end
20
+
21
+ def to_s
22
+ "Success(#{success.inspect})"
23
+ end
24
+ alias inspect to_s
25
+
26
+ def value!
27
+ success
28
+ end
29
+
30
+ def value_or(_val = nil)
31
+ success
32
+ end
33
+
34
+ def ==(other)
35
+ other.is_a?(self.class) && value! == other.value!
36
+ end
37
+
38
+ def ===(other)
39
+ other.instance_of?(self.class) && value! === other.value!
40
+ end
41
+ end
42
+
43
+ class Failure < Result
44
+ def initialize(value)
45
+ super()
46
+ @failure = value
47
+ end
48
+
49
+ def failure?
50
+ true
51
+ end
52
+
53
+ def success?
54
+ false
55
+ end
56
+
57
+ def to_s
58
+ "Failure(#{failure.inspect})"
59
+ end
60
+ alias inspect to_s
61
+
62
+ def value!
63
+ raise Error, "value! was called on #{self}"
64
+ end
65
+
66
+ def value_or(val = nil)
67
+ if block_given?
68
+ yield
69
+ else
70
+ val
71
+ end
72
+ end
73
+
74
+ def ==(other)
75
+ other.is_a?(self.class) && failure == other.failure
76
+ end
77
+
78
+ def ===(other)
79
+ other.instance_of?(self.class) && failure === other.failure
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NotMonads
4
+ VERSION = '0.1.0'
5
+ end
data/lib/not_monads.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'not_monads/version'
4
+ require_relative 'not_monads/do'
5
+
6
+ module NotMonads
7
+ class Error < StandardError; end
8
+ end
@@ -0,0 +1,4 @@
1
+ module NotMonads
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: not_monads
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - kolas
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-01-10 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Simple copy of [dry-monads](https://github.com/dry-rb/dry-monads) do
14
+ monads, it implements only mixin for your service object and Success/Failure result
15
+ object.
16
+ email:
17
+ - kolas.krytoi@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - ".devcontainer/devcontainer.json"
23
+ - ".devcontainer/docker-compose.yml"
24
+ - ".dockerignore"
25
+ - ".editorconfig"
26
+ - ".rspec"
27
+ - ".rubocop.yml"
28
+ - CHANGELOG.md
29
+ - Dockerfile
30
+ - LICENSE.txt
31
+ - README.md
32
+ - Rakefile
33
+ - docker-compose.yml
34
+ - lib/not_monads.rb
35
+ - lib/not_monads/do.rb
36
+ - lib/not_monads/result.rb
37
+ - lib/not_monads/version.rb
38
+ - sig/not_monads.rbs
39
+ homepage: https://github.com/kolasss/not_monads
40
+ licenses:
41
+ - MIT
42
+ metadata:
43
+ homepage_uri: https://github.com/kolasss/not_monads
44
+ source_code_uri: https://github.com/kolasss/not_monads
45
+ changelog_uri: https://github.com/kolasss/not_monads/blob/master/CHANGELOG.md
46
+ rubygems_mfa_required: 'true'
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 3.0.0
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubygems_version: 3.5.3
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: Simple service objects
66
+ test_files: []