simple_endpoint 0.1.6 → 1.0.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: '08fd87cf913813e20513e0e14925d45a4f9fdeb582f0db492641b4df3284e629'
4
- data.tar.gz: 42e7eea35744ff8f43afae1fe342997048dd9c42b053d2b0e178ee667f9886f1
3
+ metadata.gz: 88057b74fb64a0b700c891f2f9d4fe47d1e7270558562421eb20ec6cc509609b
4
+ data.tar.gz: eb33a881d475b47de26b0e00fafe671981708447a1c51e400fed13a5fef6a789
5
5
  SHA512:
6
- metadata.gz: 2e473a5e5b115b0e15e03316683dfd952c0c368be5ad7db85f25b439e27fac4638bdca131548d04391d54d223cfa95faf22417b721897e83426896068fe2b1f6
7
- data.tar.gz: 660bd34909b0d962ad41583f17219fe9b3108bc4a987a5acc1c8cb17ac4aece8e0b1a78c68b8600b243a0ddce2f6b263f6c6b573e472e72b705ad4f744b18150
6
+ metadata.gz: 3a5409549ff3eb0c0237838064ff9cdb9a95b9177b745573a8039e34370beead5b20a50b7baa5bb58c3bb397d581d706bf33e4ad9d28fc2c7fa6e53b052b3746
7
+ data.tar.gz: 949d6f100a2026f194b63cb1cd40284652a6a622ede5e18eb55872f5db8f570258c966c4ddfc8ebc16ff73a29f81fe2e87a62e1f879104da8ebf7270246b6c57
@@ -0,0 +1,25 @@
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ working_directory: ~/decouplio
5
+ docker:
6
+ - image: ruby:2.6.0
7
+ steps:
8
+ - checkout
9
+
10
+ - restore_cache:
11
+ keys:
12
+ - decouplio-{{ checksum "Gemfile.lock" }}
13
+ - decouplio-
14
+ - run:
15
+ name: Install dependencies
16
+ command: bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs 4 --retry 3
17
+
18
+ - save_cache:
19
+ key: decouplio-{{ checksum "Gemfile.lock" }}
20
+ paths:
21
+ - vendor/bundle
22
+
23
+ - run:
24
+ name: Run Tests
25
+ command: bundle exec rspec
data/.rubocop.yml CHANGED
@@ -1,13 +1,23 @@
1
+ require: rubocop-rspec
2
+
1
3
  AllCops:
2
- TargetRubyVersion: 2.5.1
4
+ Exclude:
5
+ - 'simple_endpoint.gemspec'
6
+
7
+ Style/Documentation:
8
+ Enabled: false
3
9
 
4
10
  Metrics/LineLength:
11
+ Max: 120
12
+
13
+ Style/FrozenStringLiteralComment:
5
14
  Enabled: true
6
- Max: 120
7
15
 
8
16
  Metrics/BlockLength:
9
- Exclude:
10
- - 'spec/**'
17
+ ExcludedMethods: ['describe','context']
11
18
 
12
- Style/Documentation:
19
+ RSpec/DescribeClass:
13
20
  Enabled: false
21
+
22
+ RSpec/NestedGroups:
23
+ Max: 4
data/CHNAGES.md ADDED
@@ -0,0 +1,7 @@
1
+ simple_endpoint changelog
2
+ =====================
3
+
4
+ [2020-01-25] Version 1.0.0
5
+ ---------------------------
6
+ **Breaking changes**
7
+ - [PR #6](https://github.com/differencialx/simple_endpoint/pull/6): Added ability to pass additional options from controller tot handlers, such as options for serialization, to avoid setting them inside trailblazer operation.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_endpoint (0.1.6)
4
+ simple_endpoint (1.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -10,10 +10,10 @@ GEM
10
10
  byebug (10.0.2)
11
11
  coderay (1.1.2)
12
12
  diff-lcs (1.3)
13
- jaro_winkler (1.5.1)
13
+ jaro_winkler (1.5.4)
14
14
  method_source (0.9.2)
15
- parallel (1.12.1)
16
- parser (2.5.3.0)
15
+ parallel (1.19.1)
16
+ parser (2.7.0.2)
17
17
  ast (~> 2.4.0)
18
18
  powerpack (0.1.2)
19
19
  pry (0.12.2)
@@ -37,7 +37,7 @@ GEM
37
37
  diff-lcs (>= 1.2.0, < 2.0)
38
38
  rspec-support (~> 3.8.0)
39
39
  rspec-support (3.8.0)
40
- rubocop (0.60.0)
40
+ rubocop (0.61.1)
41
41
  jaro_winkler (~> 1.5.1)
42
42
  parallel (~> 1.10)
43
43
  parser (>= 2.5, != 2.5.1.1)
@@ -45,8 +45,10 @@ GEM
45
45
  rainbow (>= 2.2.2, < 4.0)
46
46
  ruby-progressbar (~> 1.7)
47
47
  unicode-display_width (~> 1.4.0)
48
- ruby-progressbar (1.10.0)
49
- unicode-display_width (1.4.0)
48
+ rubocop-rspec (1.35.0)
49
+ rubocop (>= 0.60.0)
50
+ ruby-progressbar (1.10.1)
51
+ unicode-display_width (1.4.1)
50
52
 
51
53
  PLATFORMS
52
54
  ruby
@@ -56,7 +58,8 @@ DEPENDENCIES
56
58
  pry-byebug
57
59
  rake (~> 10.0)
58
60
  rspec (~> 3.0)
59
- rubocop
61
+ rubocop (~> 0.61.0)
62
+ rubocop-rspec
60
63
  simple_endpoint!
61
64
 
62
65
  BUNDLED WITH
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  # SimpleEndpoint
2
+ [![<differencialx>](https://circleci.com/gh/differencialx/simple_endpoint.svg?style=svg)](https://circleci.com/gh/differencialx/simple_endpoint)
3
+ [![Gem Version](https://img.shields.io/gem/v/simple_endpoint.svg)](https://rubygems.org/gems/simple_endpoint)
2
4
 
3
5
  Dry-matcher free implementation of trailblazer endpoint.
4
6
 
@@ -6,7 +8,7 @@ Dry-matcher free implementation of trailblazer endpoint.
6
8
  Add this to your Gemfile:
7
9
 
8
10
  ```ruby
9
- gem 'simple_endpoint'
11
+ gem 'simple_endpoint', '~> 1.0.0'
10
12
  ```
11
13
 
12
14
  ## Getting Started
@@ -46,8 +48,8 @@ class ApplicationController < ActionController::Base
46
48
 
47
49
  def default_handler
48
50
  {
49
- success: -> (result) { render json: result['model'], **result['render_options'], status: 200 },
50
- invalid: -> (result) { render json: result['contract.default'].errors, serializer: ErrorSerializer, status: :unprocessable_entity }
51
+ success: -> (result, **opts) { render json: result['model'], **opts, status: 200 },
52
+ invalid: -> (result, **) { render json: result['contract.default'].errors, serializer: ErrorSerializer, status: :unprocessable_entity }
51
53
  }
52
54
  end
53
55
  end
@@ -73,6 +75,7 @@ Now you are able to use `endpoint` method at other controllers
73
75
  | `:different_handler` | no | {} | Case of handler that should be handled in different way |
74
76
  | `:options` | no | {} | Additional hash which will be merged to `#ednpoint_options` method result before operation execution |
75
77
  | `:before_render` | no | {} | Allow to process code before specific case handler |
78
+ | `:renderer_options` | no | {} | Allow to pass serializer options from controller and Will available inside handler as second parameter.
76
79
 
77
80
 
78
81
  #### Simple endpoint call
@@ -100,7 +103,7 @@ class PostsController < ApplicationController
100
103
  {
101
104
  success: -> (result) { result.success? && is_it_raining? },
102
105
  invalid: -> (result) { result.failure? && is_vasya_in_the_house? }
103
- ... # other cases
106
+ ... # other cases
104
107
  }
105
108
  end
106
109
 
@@ -155,7 +158,7 @@ class PostsController < ApplicationController
155
158
 
156
159
  def default_handler
157
160
  {
158
- success: -> (result) { head :ok }
161
+ success: -> (result, **) { head :ok }
159
162
  }
160
163
  end
161
164
  end
@@ -174,7 +177,7 @@ class PostsController < ApplicationController
174
177
 
175
178
  def different_handler
176
179
  {
177
- success: -> (result) { render json: { message: 'Nice!' }, status: :created }
180
+ success: -> (result, **) { render json: { message: 'Nice!' }, status: :created }
178
181
  }
179
182
  end
180
183
  end
@@ -230,17 +233,40 @@ class PostsController < ApplicationController
230
233
  def create
231
234
  endpoint operation: Post::Create,
232
235
  before_response: before_render_actions
233
- end
236
+ end
234
237
  end
235
238
 
236
239
  private
237
240
 
238
241
  def before_response_actions
239
242
  {
240
- success: -> (result) { response.headers['Some-header'] = result[:some_data] }
243
+ success: -> (result, **) { response.headers['Some-header'] = result[:some_data] }
241
244
  }
242
245
  end
243
246
  end
244
247
  ```
245
248
 
246
249
  Code above will put data from operation result into response haeders before render
250
+
251
+
252
+ #### Pass additional options from controller
253
+
254
+ ```ruby
255
+ class PostsController < ApplicationController
256
+ def create
257
+ endpoint operation: Post::Create,
258
+ renderer_options: { serializer: SerializerClass }
259
+ end
260
+ end
261
+
262
+ private
263
+
264
+ def default_handler
265
+ {
266
+ # renderer_options will be available as **opts
267
+ success: -> (result, **opts) { render json: result['model'], **opts, status: 200 },
268
+ invalid: -> (result, **) { render json: result['contract.default'].errors, serializer: ErrorSerializer, status: :unprocessable_entity }
269
+ }
270
+ end
271
+ end
272
+ ```
@@ -1,14 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'simple_endpoint/version'
4
-
4
+ # rubocop:disable Metrics/ParameterLists
5
5
  module SimpleEndpoint
6
6
  module Controller
7
- def endpoint(operation:, different_cases: {}, different_handler: {}, options: {}, before_response: {})
7
+ def endpoint(operation:,
8
+ different_cases: {},
9
+ different_handler: {},
10
+ options: {},
11
+ before_response: {},
12
+ renderer_options: {})
8
13
  Endpoint.call(
9
14
  operation,
10
15
  default_handler.merge(different_handler),
11
16
  default_cases.merge(different_cases),
17
+ renderer_options,
12
18
  before_response,
13
19
  endpoint_options.merge(options)
14
20
  )
@@ -30,15 +36,15 @@ module SimpleEndpoint
30
36
  end
31
37
 
32
38
  class Endpoint
33
- def self.call(operation, handler, cases, before_response = {}, **args)
39
+ def self.call(operation, handler, cases, renderer_options = {}, before_response = {}, **args)
34
40
  result = operation.call(**args)
35
- new.call(result, cases, handler, before_response)
41
+ new.call(result, cases, renderer_options, handler, before_response)
36
42
  end
37
43
 
38
- def call(result, cases, handler = {}, before_response = {})
44
+ def call(result, cases, renderer_options = {}, handler = {}, before_response = {})
39
45
  matched_case = matched_case(cases, result)
40
- procees_handler(matched_case, before_response, result) unless before_response.empty?
41
- procees_handler(matched_case, handler, result, UnhadledResultError)
46
+ procees_handler(matched_case, before_response, result, renderer_options) unless before_response.empty?
47
+ procees_handler(matched_case, handler, result, renderer_options, UnhadledResultError)
42
48
  end
43
49
 
44
50
  def matched_case(cases, result)
@@ -48,19 +54,16 @@ module SimpleEndpoint
48
54
  matched_case
49
55
  end
50
56
 
51
- def procees_handler(matched_case, handler, result, exception_class = nil)
57
+ def procees_handler(matched_case, handler, result, renderer_options, exception_class = nil)
52
58
  if handler.key?(matched_case)
53
- handler.dig(matched_case)&.(result)
59
+ handler.dig(matched_case)&.(result, **renderer_options)
54
60
  elsif exception_class
55
61
  raise exception_class, "Key: #{matched_case} is not present at #{handler}"
56
62
  end
57
63
  end
58
64
 
59
65
  def obtain_matched_case(cases, result)
60
- matched_case = cases.each { |kase, condition| break kase if condition.call(result) }
61
- return if matched_case.is_a?(Hash)
62
-
63
- matched_case
66
+ cases.detect { |_kase, condition| condition.call(result) }&.first
64
67
  end
65
68
  end
66
69
 
@@ -124,3 +127,4 @@ module SimpleEndpoint
124
127
  You can move this to separate singleton class
125
128
  LARGE_ERROR
126
129
  end
130
+ # rubocop:enable Metrics/ParameterLists
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SimpleEndpoint
4
- VERSION = '0.1.6'
4
+ VERSION = '1.0.0'
5
5
  end
@@ -36,5 +36,6 @@ Gem::Specification.new do |spec|
36
36
  spec.add_development_dependency 'pry-byebug'
37
37
  spec.add_development_dependency 'rake', '~> 10.0'
38
38
  spec.add_development_dependency 'rspec', '~> 3.0'
39
- spec.add_development_dependency 'rubocop'
39
+ spec.add_development_dependency 'rubocop', '~> 0.61.0'
40
+ spec.add_development_dependency 'rubocop-rspec'
40
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_endpoint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Bal
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-18 00:00:00.000000000 Z
11
+ date: 2020-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -68,6 +68,20 @@ dependencies:
68
68
  version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.61.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.61.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
@@ -88,12 +102,13 @@ executables: []
88
102
  extensions: []
89
103
  extra_rdoc_files: []
90
104
  files:
105
+ - ".circleci/config.yml"
91
106
  - ".gitignore"
92
107
  - ".rspec"
93
108
  - ".rubocop.yml"
94
109
  - ".ruby-gemset"
95
110
  - ".ruby-version"
96
- - ".travis.yml"
111
+ - CHNAGES.md
97
112
  - Gemfile
98
113
  - Gemfile.lock
99
114
  - LICENSE
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.5.1
5
- before_install: gem install bundler -v 1.16.2