simple_endpoint 0.1.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a8d160bdac054393e08f0451d7117a710140cd02614d8bc7d212de43e8fe4caf
4
+ data.tar.gz: e6af102683834cf488a5dce4589e27c356e0994485679722a94569cae8a2e258
5
+ SHA512:
6
+ metadata.gz: f20a4512bbce57067e072a6f7d67b73a88fd606b5b9e01af7d71ab7b4460d9e71c603e05e3205853506d4f05d8295eef121f07a7e730cad610ed4a878d038f04
7
+ data.tar.gz: a46a439a455f21f4e83914210aeeb1d4b6fa29996cc4fbb1499484baee633bc58abf7f1b264f7cc767fe54e2d5f64dcc1969045a5f45879dc6dcbe1632f8feec
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,13 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
4
+ Metrics/LineLength:
5
+ Enabled: true
6
+ Max: 120
7
+
8
+ Metrics/BlockLength:
9
+ Exclude:
10
+ - 'spec/**'
11
+
12
+ Style/Documentation:
13
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.5.1
5
+ before_install: gem install bundler -v 1.16.2
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
+
7
+ # Specify your gem's dependencies in simple_endpoint.gemspec
8
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,63 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ simple_endpoint (0.1.2)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.0)
10
+ byebug (10.0.2)
11
+ coderay (1.1.2)
12
+ diff-lcs (1.3)
13
+ jaro_winkler (1.5.1)
14
+ method_source (0.9.2)
15
+ parallel (1.12.1)
16
+ parser (2.5.3.0)
17
+ ast (~> 2.4.0)
18
+ powerpack (0.1.2)
19
+ pry (0.12.2)
20
+ coderay (~> 1.1.0)
21
+ method_source (~> 0.9.0)
22
+ pry-byebug (3.6.0)
23
+ byebug (~> 10.0)
24
+ pry (~> 0.10)
25
+ rainbow (3.0.0)
26
+ rake (10.5.0)
27
+ rspec (3.8.0)
28
+ rspec-core (~> 3.8.0)
29
+ rspec-expectations (~> 3.8.0)
30
+ rspec-mocks (~> 3.8.0)
31
+ rspec-core (3.8.0)
32
+ rspec-support (~> 3.8.0)
33
+ rspec-expectations (3.8.2)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.8.0)
36
+ rspec-mocks (3.8.0)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.8.0)
39
+ rspec-support (3.8.0)
40
+ rubocop (0.60.0)
41
+ jaro_winkler (~> 1.5.1)
42
+ parallel (~> 1.10)
43
+ parser (>= 2.5, != 2.5.1.1)
44
+ powerpack (~> 0.1)
45
+ rainbow (>= 2.2.2, < 4.0)
46
+ ruby-progressbar (~> 1.7)
47
+ unicode-display_width (~> 1.4.0)
48
+ ruby-progressbar (1.10.0)
49
+ unicode-display_width (1.4.0)
50
+
51
+ PLATFORMS
52
+ ruby
53
+
54
+ DEPENDENCIES
55
+ bundler (~> 1.16)
56
+ pry-byebug
57
+ rake (~> 10.0)
58
+ rspec (~> 3.0)
59
+ rubocop
60
+ simple_endpoint!
61
+
62
+ BUNDLED WITH
63
+ 1.16.2
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 differencialx
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,247 @@
1
+ # SimpleEndpoint
2
+
3
+ Dry-matcher free implementation of trailblazer endpoint.
4
+
5
+ ## Installation
6
+ Add this to your Gemfile:
7
+
8
+ ```ruby
9
+ gem 'simple_endpoint' # not released yet
10
+ gem 'simple_endpoint', github: 'differencialx/simple_endpoint', :branch => 'master'
11
+ ```
12
+
13
+ ## Getting Started
14
+
15
+ Include simple endpoint to your base controller
16
+
17
+ ```ruby
18
+ class ApplicationController < ActionController::Base
19
+ include SimpleEndpoint::Controller
20
+ end
21
+ ```
22
+
23
+ Define `default_cases` method to specify trailblazer operation result handling
24
+
25
+ ```ruby
26
+ class ApplicationController < ActionController::Base
27
+ include SimpleEndpoint::Controller
28
+
29
+ private
30
+
31
+ def default_cases
32
+ {
33
+ success: -> (result) { result.success? },
34
+ invalid: -> (result) { result.failure? }
35
+ }
36
+ end
37
+ end
38
+ ```
39
+
40
+ Define `default_handler` method to specify how to handle each case
41
+
42
+ ```ruby
43
+ class ApplicationController < ActionController::Base
44
+ include SimpleEndpoint::Controller
45
+
46
+ private
47
+
48
+ def default_handler
49
+ {
50
+ success: -> (result) { render json: result['model'], **result['render_options'] status: 200 },
51
+ invalid: -> (result) { render json: result['contract.default'].errors, serializer: ErrorSerializer, status: :unprocessable_entity }
52
+ }
53
+ end
54
+ end
55
+ ```
56
+
57
+ `OperationIsNotHandled` error will be raised if `#default_cases` doesn't contain case for specific operation result.
58
+
59
+ `UnhadledResultError` will be raised if `#default_handler` doesn't contain for some cases.
60
+
61
+ `NotImplementedError` will be raised if `default_cases` or `default_handler` methods aren't defined.
62
+
63
+
64
+ ### #endpoint method
65
+
66
+ Now you are able to use `endpoint` method at other controllers
67
+
68
+ `#endpoint` method has next signature:
69
+
70
+ | Key | Required | Default value | Description |
71
+ |---|---|---|---|
72
+ | `:operation` | yes | - | Traiblazer operation class |
73
+ | `:different_cases`| no | {} | Cases that should be redefined for exact `#endpoint` call |
74
+ | `:different_handler` | no | {} | Case of handler that should be handled in different way |
75
+ | `:options` | no | {} | Additional hash which will be merged to `#ednpoint_options` method result before operation execution |
76
+ | `:before_render` | no | {} | Allow to process code before specific case handler |
77
+
78
+
79
+ #### Simple endpoint call
80
+ ```ruby
81
+ class PostsController < ApplicationController
82
+ def create
83
+ endpoint operation: Post::Create
84
+ end
85
+ end
86
+ ```
87
+
88
+ #### Redefining cases for specific controller
89
+
90
+ If you need to redefine operation result handling for specific controller you can do next
91
+
92
+ ```ruby
93
+ class PostsController < ApplicationController
94
+ def create
95
+ endpoint operation: Post::Create
96
+ end
97
+
98
+ private
99
+
100
+ def default_cases
101
+ {
102
+ success: -> (result) { result.success? && is_it_raining? },
103
+ invalid: -> (result) { result.failure? && is_vasya_in_the_house? }
104
+ ... # other cases
105
+ }
106
+ end
107
+
108
+ def is_it_raining?
109
+ WeatherForecast.for_today.raining?
110
+ end
111
+
112
+ def is_vasya_in_the_house?
113
+ User.find_by(login: 'vasya').signed_in?
114
+ end
115
+ end
116
+ ```
117
+
118
+ Note that it'll override `ApplicationController#default_cases`
119
+
120
+ #### Redefining cases for specific controller action
121
+
122
+ Code below will redefine only `success` operation handling logic of `#default_cases` method, it doesn't matter where `#default_cases` was defined, at `ApplicationController` or `PostsController`
123
+
124
+ ```ruby
125
+ class PostsController < ApplicationController
126
+ def create
127
+ endpoint operation: Post::Create,
128
+ different_cases: different_cases
129
+ end
130
+
131
+ private
132
+
133
+ def different_cases
134
+ {
135
+ success: -> (result) { result.success? && is_vasya_in_the_house? }
136
+ }
137
+ end
138
+
139
+ def is_vasya_in_the_house?
140
+ User.find_by(login: 'vasya').signed_in?
141
+ end
142
+ end
143
+ ```
144
+
145
+ #### Redefining handler for specific controller
146
+
147
+ If you need to redefine handler logic, simply redefine `#default_handler` method
148
+
149
+ ```ruby
150
+ class PostsController < ApplicationController
151
+ def create
152
+ endpoint operation: Post::Create
153
+ end
154
+
155
+ private
156
+
157
+ def default_handler
158
+ {
159
+ success: -> (result) { head :ok }
160
+ }
161
+ end
162
+ end
163
+ ```
164
+
165
+ #### Redefining handler for specific controller action
166
+
167
+ ```ruby
168
+ class PostsController < ApplicationController
169
+ def create
170
+ endpoint operation: Post::Create,
171
+ different_handler: different_handler
172
+ end
173
+
174
+ private
175
+
176
+ def different_handler
177
+ {
178
+ success: -> (result) { render json: { message: 'Nice!' }, status: :created }
179
+ }
180
+ end
181
+ end
182
+
183
+ ```
184
+
185
+ #### Defining default params for trailblazer operation
186
+
187
+ Default `#endpoint_options` method implementation
188
+
189
+ ```ruby
190
+ def endpoint_options
191
+ { params: params }
192
+ end
193
+ ```
194
+
195
+ Redefining `endpoint_options`
196
+
197
+ ```ruby
198
+ class PostsController < ApplicationController
199
+
200
+ private
201
+
202
+ def endpoint_options
203
+ { params: permitted_params }
204
+ end
205
+
206
+ def permitted_params
207
+ params.permit(:some, :attributes)
208
+ end
209
+ end
210
+ ```
211
+
212
+ #### Passing additional params to operation
213
+
214
+ `options` will be merged with `#endpoint_options` method result and trailblazer operation will be executed with such params: `Post::Create.(params: params, current_user: current_user)`
215
+
216
+ ```ruby
217
+ class PostsController < ApplicationController
218
+ def create
219
+ endpoint operation: Post::Create,
220
+ options: { current_user: current_user }
221
+ end
222
+ end
223
+ ```
224
+
225
+ #### Before handler actions
226
+
227
+ You can do some actions before `#default_handler` execution
228
+
229
+ ```ruby
230
+ class PostsController < ApplicationController
231
+ def create
232
+ endpoint operation: Post::Create,
233
+ before_response: before_render_actions
234
+ end
235
+ end
236
+
237
+ private
238
+
239
+ def before_response_actions
240
+ {
241
+ success: -> (result) { response.headers['Some-header'] = result[:some_data] }
242
+ }
243
+ end
244
+ end
245
+ ```
246
+
247
+ Code above will put data from operation result into response haeders before render
data/Rakefile ADDED
@@ -0,0 +1,8 @@
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
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'simple_endpoint'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SimpleEndpoint
4
+ VERSION = '0.1.2'
5
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'simple_endpoint/version'
4
+
5
+ module SimpleEndpoint
6
+ module Controller
7
+ def endpoint(operation:, different_cases: {}, different_hander: {}, options: {}, before_response: {})
8
+ Endpoint.call(
9
+ operation,
10
+ default_handler.merge(different_hander),
11
+ default_cases.merge(different_cases),
12
+ before_response,
13
+ endpoint_options.merge(options)
14
+ )
15
+ end
16
+
17
+ private
18
+
19
+ def endpoint_options
20
+ { params: params }
21
+ end
22
+
23
+ def default_handler
24
+ raise NotImplementedError, HANDLER_ERROR_MESSAGE
25
+ end
26
+
27
+ def default_cases
28
+ raise NotImplementedError, CASES_ERROR_MESSAGE
29
+ end
30
+ end
31
+
32
+ class Endpoint
33
+ def self.call(operation, handler, cases, before_response = {}, **args)
34
+ result = operation.call(**args)
35
+ new.call(result, cases, handler, before_response)
36
+ end
37
+
38
+ def call(result, cases, handler = {}, before_response = {})
39
+ 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)
42
+ end
43
+
44
+ def matched_case(cases, result)
45
+ matched_case = obtain_matched_case(cases, result)
46
+ raise OperationIsNotHandled, OPERATION_IS_NOT_HANDLER_ERROR unless matched_case
47
+
48
+ matched_case
49
+ end
50
+
51
+ def procees_handler(matched_case, handler, result, exception_class = nil)
52
+ if handler.key?(matched_case)
53
+ handler.dig(matched_case)&.(result)
54
+ elsif exception_class
55
+ raise exception_class, "Key: #{matched_case} is not present at #{handler}"
56
+ end
57
+ end
58
+
59
+ 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
64
+ end
65
+ end
66
+
67
+ class OperationIsNotHandled < StandardError; end
68
+ class UnhadledResultError < StandardError; end
69
+
70
+ OPERATION_IS_NOT_HANDLER_ERROR = 'Current operation result is not handled at #default_cases method'
71
+ HANDLER_ERROR_MESSAGE = <<-LARGE_ERROR
72
+ Please implement default_handler via case statement
73
+
74
+ EXAMPLE:
75
+ ###############################################
76
+
77
+ # Can be put into ApplicationController and redefined in subclasses
78
+
79
+ private
80
+
81
+ def default_handler
82
+ -> (kase, result) do
83
+ case kase
84
+ when :success then render :json ...
85
+ else
86
+ # just in case you forgot to add handler for some of case
87
+ SimpleEndpoint::UnhadledResultError, 'Oh nooooo!!! Really???!!'
88
+ end
89
+ end
90
+ end
91
+
92
+ ###############################################
93
+
94
+ OR
95
+
96
+ You can move this logic to separate singleton class
97
+ LARGE_ERROR
98
+
99
+ CASES_ERROR_MESSAGE = <<-LARGE_ERROR
100
+ Please implement default cases conditions via hash
101
+
102
+ EXAMPLE:
103
+ ###############################################
104
+ # default trailblazer-endpoint logic, you can change it
105
+ # Can be put into ApplicationController and redefined in subclasses
106
+
107
+ private
108
+
109
+ def default_cases
110
+ {
111
+ present: -> (result) { result.success? && result["present"] }
112
+ success: -> (result) { result.success? },
113
+ created: -> (result) { result.success? && result["model.action"] == :new }
114
+ invalid: -> (result) { result.failure? },
115
+ not_found: -> (result) { result.failure? && result["result.model"] && result["result.model"].failure? },
116
+ unauthenticated: -> (result) { result.failure? && result["result.policy.default"] && result["result.policy.default"].failure? }
117
+ }
118
+ end
119
+
120
+ ###############################################
121
+
122
+ OR
123
+
124
+ You can move this to separate singleton class
125
+ LARGE_ERROR
126
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'simple_endpoint/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'simple_endpoint'
9
+ spec.version = SimpleEndpoint::VERSION
10
+ spec.authors = ['Alex Bal']
11
+ spec.email = ['differencialx@gmail.com']
12
+
13
+ spec.summary = 'Simple implementation of Trailblazer endpoint'
14
+ spec.description = 'Simple implementation of Trailblazer endpoint'
15
+ spec.homepage = ''
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
+ else
22
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
23
+ 'public gem pushes.'
24
+ end
25
+
26
+ # Specify which files should be added to the gem when it is released.
27
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
28
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
29
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
+ end
31
+ spec.bindir = 'exe'
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ spec.require_paths = ['lib']
34
+
35
+ spec.add_development_dependency 'bundler', '~> 1.16'
36
+ spec.add_development_dependency 'pry-byebug'
37
+ spec.add_development_dependency 'rake', '~> 10.0'
38
+ spec.add_development_dependency 'rspec', '~> 3.0'
39
+ spec.add_development_dependency 'rubocop'
40
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple_endpoint
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Alex Bal
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-03-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry-byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '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'
83
+ description: Simple implementation of Trailblazer endpoint
84
+ email:
85
+ - differencialx@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".rubocop.yml"
93
+ - ".travis.yml"
94
+ - Gemfile
95
+ - Gemfile.lock
96
+ - LICENSE
97
+ - README.md
98
+ - Rakefile
99
+ - bin/console
100
+ - bin/setup
101
+ - lib/simple_endpoint.rb
102
+ - lib/simple_endpoint/version.rb
103
+ - simple_endpoint.gemspec
104
+ homepage: ''
105
+ licenses: []
106
+ metadata:
107
+ allowed_push_host: https://rubygems.org
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.7.7
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: Simple implementation of Trailblazer endpoint
128
+ test_files: []