Skip to content

Commit e7dd1c6

Browse files
committed
Added service
1 parent d6d80fd commit e7dd1c6

File tree

10 files changed

+117
-27
lines changed

10 files changed

+117
-27
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@
77
/pkg/
88
/spec/reports/
99
/tmp/
10+
.ruby-gemset

.rspec

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
--require spec_helper
2+
--format documentation
3+
--color

.rubocop.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ AllCops:
22
DisplayCopNames: true
33
DisplayStyleGuide: true
44
StyleGuideCopsOnly: true
5-
TargetRubyVersion: 2.3
5+
TargetRubyVersion: 2.4.1
66

77
Metrics/LineLength:
88
Max: 120
@@ -18,4 +18,4 @@ Style/FileName:
1818

1919
Metrics/ModuleLength:
2020
Exclude:
21-
- spec/**/*_spec.rb
21+
- spec/**/*_spec.rb

circle.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
machine:
22
ruby:
3-
version: 2.3.4
3+
version: 2.4.1

lib/operators/service.rb

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,43 @@
1-
require "operators/service/version"
1+
require 'dry-monads'
22

33
module Operators
4-
module Service
5-
# Your code goes here...
4+
class Service
5+
def self.rescue_callbacks(*exceptions)
6+
define_method :call do
7+
begin
8+
calling
9+
rescue *exceptions => error
10+
failure(error.message)
11+
end
12+
end
13+
end
14+
15+
rescue_callbacks
16+
17+
def self.call(*args)
18+
new(*args).call
19+
end
20+
21+
def success(result = nil)
22+
Dry::Monads.Right(success_wrap(result))
23+
end
24+
25+
def failure(result = nil)
26+
Dry::Monads.Left(error_wrap(result))
27+
end
28+
29+
private
30+
31+
def error_wrap(result)
32+
result
33+
end
34+
35+
def success_wrap(result)
36+
result
37+
end
38+
39+
def calling
40+
raise 'Must be redefined'
41+
end
642
end
743
end

lib/operators/service/version.rb

Lines changed: 0 additions & 5 deletions
This file was deleted.

lib/operators_service.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
require "operators/service"

operators-service.gemspec

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
# coding: utf-8
22
lib = File.expand_path('../lib', __FILE__)
33
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4-
require 'operators/service/version'
54

65
Gem::Specification.new do |spec|
7-
spec.name = "operators-service"
8-
spec.version = Operators::Service::VERSION
9-
spec.authors = ["Kirill Shevchenko"]
10-
spec.email = ["[email protected]"]
6+
spec.name = 'operators-service'
7+
spec.version = '0.1.1'
8+
spec.authors = ['Yaroslav Bezrukavyi', 'Kirill Shevchenko']
9+
1110

12-
spec.summary = %q{operators-service}
13-
spec.description = %q{operators-service}
14-
spec.homepage = "http://operators-rb.org"
15-
spec.license = "MIT"
11+
spec.summary = 'You will always know the type of the result'
12+
spec.description = 'Service is based on Dry::Monads'
13+
spec.homepage = 'http://operators-rb.org'
14+
spec.license = 'MIT'
1615

17-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
18-
f.match(%r{^(test|spec|features)/})
19-
end
20-
spec.bindir = "exe"
16+
spec.files = `git ls-files -z`.split("\x0")
17+
spec.bindir = 'exe'
2118
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22-
spec.require_paths = ["lib"]
19+
spec.require_paths = ['lib']
2320

24-
spec.add_development_dependency 'bundler', '~> 1.13'
21+
spec.add_dependency 'dry-monads', '~> 0.3.1'
22+
23+
spec.add_development_dependency 'bundler', '~> 1.15.4'
2524
spec.add_development_dependency 'rake', '~> 10.0'
26-
spec.add_development_dependency 'rspec', '~> 3.5.0'
25+
spec.add_development_dependency 'rspec', '~> 3.0'
2726
spec.add_development_dependency 'byebug', '~> 3.5.0'
2827
spec.add_development_dependency 'rubocop', '~> 0.48.0'
2928
end

spec/operators/service_spec.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
RSpec.describe Operators::Service do
2+
before do
3+
class TestSerivce < Operators::Service
4+
rescue_callbacks SyntaxError
5+
6+
def initialize(data, result)
7+
@data = data
8+
@result = result
9+
end
10+
11+
def calling
12+
@result ? success(@data) : failure(@data)
13+
end
14+
15+
def except_error(error)
16+
raise error
17+
end
18+
end
19+
end
20+
21+
it 'success result' do
22+
result = TestSerivce.call('data', true)
23+
expect(result.success?).to be_truthy
24+
end
25+
26+
it 'failure result' do
27+
result = TestSerivce.call('data', false)
28+
expect(result.success?).to be_falsey
29+
end
30+
31+
context 'catch error' do
32+
subject { TestSerivce.new('error', true) }
33+
34+
it 'catch' do
35+
allow(subject).to receive(:calling).and_raise(SyntaxError)
36+
37+
expect(subject.call.failure?).to be_truthy
38+
end
39+
40+
it 'not catch' do
41+
allow(subject).to receive(:calling).and_raise(LoadError)
42+
43+
expect { subject.call }.to raise_exception(LoadError)
44+
end
45+
end
46+
end

spec/spec_helper.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require 'bundler/setup'
2+
require 'byebug'
3+
require 'operators/service'
4+
5+
RSpec.configure do |config|
6+
config.order = :random
7+
config.filter_run focus: true
8+
config.run_all_when_everything_filtered = true
9+
end

0 commit comments

Comments
 (0)