ruby_slime 0.0.1
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 +7 -0
- data/LICENSE.md +28 -0
- data/README.md +19 -0
- data/lib/ruby_slime/command.rb +33 -0
- data/lib/ruby_slime/concurrent_write_detected.rb +6 -0
- data/lib/ruby_slime/event.rb +36 -0
- data/lib/ruby_slime/event_dispatcher.rb +18 -0
- data/lib/ruby_slime/event_queue.rb +11 -0
- data/lib/ruby_slime/event_router.rb +18 -0
- data/lib/ruby_slime/internals/event_metadata_handler.rb +36 -0
- data/lib/ruby_slime/internals.rb +7 -0
- data/lib/ruby_slime/jwt_kit/api_verifier.rb +81 -0
- data/lib/ruby_slime/jwt_kit/handling_helper.rb +42 -0
- data/lib/ruby_slime/jwt_kit/token_error.rb +14 -0
- data/lib/ruby_slime/jwt_kit.rb +9 -0
- data/lib/ruby_slime/mongoid/interactor.rb +77 -0
- data/lib/ruby_slime/mongoid/stale_record.rb +9 -0
- data/lib/ruby_slime/mongoid/state.rb +14 -0
- data/lib/ruby_slime/mongoid.rb +8 -0
- data/lib/ruby_slime/process_helper.rb +37 -0
- data/lib/ruby_slime/schema_violation.rb +12 -0
- data/lib/ruby_slime/unknown_command.rb +12 -0
- data/lib/ruby_slime/version.rb +5 -0
- data/lib/ruby_slime.rb +19 -0
- metadata +151 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 016751bd1a7ff4786175ba1de34a94c8358c71145f6b24bed359e54a5b2f64d9
|
4
|
+
data.tar.gz: 2a2f73d7f2fd439badd416d433879ef28097aabe1de92a8f92177fc1fe331707
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 484554d5c87bbac120624f97029a35a80937aa05aa3ee70ee186f60431679e368c404d638466022e269696351634dd1327fc9c21bb2b4ed1d7bdce008291f8b2
|
7
|
+
data.tar.gz: 4b3ff146857e90975dd948937f09b1b01b4aca5457b561f4cd23cccb131a398499cbd552b7c770b2c73ba543d08d76dbef29cba4310604c231399cc36fe0b871
|
data/LICENSE.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
BSD 3-Clause License
|
2
|
+
====================
|
3
|
+
|
4
|
+
_Copyright © `2023`, `Sarun Rattanasiri`_
|
5
|
+
_All rights reserved._
|
6
|
+
|
7
|
+
Redistribution and use in source and binary forms, with or without modification,
|
8
|
+
are permitted provided that the following conditions are met:
|
9
|
+
|
10
|
+
* Redistributions of source code must retain the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer.
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
14
|
+
and/or other materials provided with the distribution.
|
15
|
+
* Neither the name of the copyright holder nor the names of its contributors
|
16
|
+
may be used to endorse or promote products derived from this software
|
17
|
+
without specific prior written permission.
|
18
|
+
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
21
|
+
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
+
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
23
|
+
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
24
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
25
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
26
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
28
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# RubySlime
|
2
|
+
## What is it?
|
3
|
+
It is a collection of infrastructure utilities utilized by [Slime Systems](https://slime.systems/).
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
~~~ruby
|
10
|
+
gem 'ruby_slime'
|
11
|
+
~~~
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle install
|
16
|
+
|
17
|
+
## License
|
18
|
+
Currently, we use the library privately; we don't think it will gain any attention as we never explain anything to anyone.
|
19
|
+
However, RubySlime is released under the [3-clause BSD License](LICENSE.md) anyway.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module Command
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
extend ::Forwardable
|
7
|
+
include ::ActiveModel::Model
|
8
|
+
include ::ActiveModel::Attributes
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
attr_reader :_applied_schema
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def apply_schema(schema)
|
16
|
+
@_applied_schema = schema
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def attributes
|
21
|
+
@attributes__immutable_cache ||= begin
|
22
|
+
normalized = super.compact
|
23
|
+
schema = self.class._applied_schema
|
24
|
+
return normalized unless schema
|
25
|
+
result = schema.call(normalized)
|
26
|
+
raise SchemaViolation.new(result.errors) unless result.success?
|
27
|
+
result.to_h
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def_delegators :attributes, :[], :values_at
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module Event
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
attr_reader :data, :metadata
|
8
|
+
|
9
|
+
def initialize(data: {}, metadata: nil)
|
10
|
+
@data = data
|
11
|
+
@metadata = metadata
|
12
|
+
end
|
13
|
+
|
14
|
+
class_methods do
|
15
|
+
def strict(data: {}, metadata: nil)
|
16
|
+
new(
|
17
|
+
data: _ensure_schema(data),
|
18
|
+
metadata: metadata,
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def apply_schema(schema)
|
25
|
+
@_applied_schema = schema
|
26
|
+
end
|
27
|
+
|
28
|
+
def _ensure_schema(data)
|
29
|
+
return data unless @_applied_schema
|
30
|
+
result = @_applied_schema.call(data)
|
31
|
+
raise SchemaViolation.new(result.errors) unless result.success?
|
32
|
+
result.to_h
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
class EventDispatcher
|
5
|
+
include Internals::EventMetadataHandler
|
6
|
+
|
7
|
+
def initialize(*handlers)
|
8
|
+
@handlers = handlers
|
9
|
+
freeze
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(events, **metadata)
|
13
|
+
@handlers.each do |handler|
|
14
|
+
handle_handler_arguments(handler, events, metadata)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
class EventRouter
|
5
|
+
include Internals::EventMetadataHandler
|
6
|
+
|
7
|
+
def initialize(handlers_map = {})
|
8
|
+
@handlers_map = handlers_map
|
9
|
+
freeze
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(event, **metadata)
|
13
|
+
handler = @handlers_map[event.class]
|
14
|
+
return unless handler
|
15
|
+
handle_handler_arguments(handler, event, metadata)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module Internals
|
5
|
+
module EventMetadataHandler
|
6
|
+
private
|
7
|
+
|
8
|
+
def handle_handler_arguments(handler, events, metadata)
|
9
|
+
handler.call(events, **metadata)
|
10
|
+
rescue ::ArgumentError => e
|
11
|
+
cache = EventMetadataHandler_SingletonCache.instance
|
12
|
+
should_retry = cache.meta_patterns.any? do |pattern|
|
13
|
+
pattern =~ e.message
|
14
|
+
end
|
15
|
+
raise e unless should_retry
|
16
|
+
handler.call(events)
|
17
|
+
end
|
18
|
+
|
19
|
+
class EventMetadataHandler_SingletonCache
|
20
|
+
include ::Singleton
|
21
|
+
attr_reader :meta_patterns
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@meta_patterns = [
|
25
|
+
/wrong\s+number\s+of\s+arguments/i,
|
26
|
+
/unknown\s+keywords/i,
|
27
|
+
]
|
28
|
+
super
|
29
|
+
freeze
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private_constant :EventMetadataHandler_SingletonCache
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module JWTKit
|
5
|
+
class APIVerifier
|
6
|
+
extend ::Forwardable
|
7
|
+
|
8
|
+
def initialize(
|
9
|
+
fetch_secret:,
|
10
|
+
handle_result:
|
11
|
+
)
|
12
|
+
@fetch_secret = fetch_secret
|
13
|
+
@handle_result = handle_result
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(token)
|
17
|
+
token_result = token_schema.call({
|
18
|
+
token: token,
|
19
|
+
})
|
20
|
+
raise TokenError.new(token_result.errors) unless token_result.success?
|
21
|
+
::JWT.decode(token_result[:token], nil, true, {
|
22
|
+
algorithm: 'HS256',
|
23
|
+
required_claims: %w[aud iat sub],
|
24
|
+
}) do |header|
|
25
|
+
header_result = header_schema.call(header)
|
26
|
+
raise TokenError.new(header_result.errors) unless header_result.success?
|
27
|
+
@fetch_secret.call(header_result.to_h)
|
28
|
+
end.then do |sections|
|
29
|
+
payload_section, header_section = sections
|
30
|
+
header_result = header_schema.call(header_section)
|
31
|
+
raise TokenError.new(header_result.errors) unless header_result.success?
|
32
|
+
payload_result = payload_schema.call(payload_section)
|
33
|
+
raise TokenError.new(payload_result.errors) unless payload_result.success?
|
34
|
+
[payload_result, header_result].map(&:to_h)
|
35
|
+
end.then do |sections|
|
36
|
+
@handle_result.call(*sections)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def_delegators :singleton_cache,
|
43
|
+
:token_schema,
|
44
|
+
:header_schema,
|
45
|
+
:payload_schema
|
46
|
+
|
47
|
+
def singleton_cache
|
48
|
+
APIVerifier_SingletonCache.instance
|
49
|
+
end
|
50
|
+
|
51
|
+
class APIVerifier_SingletonCache
|
52
|
+
include ::Singleton
|
53
|
+
attr_reader \
|
54
|
+
:token_schema,
|
55
|
+
:header_schema,
|
56
|
+
:payload_schema
|
57
|
+
|
58
|
+
def initialize
|
59
|
+
@token_schema = ::Dry::Schema.Params do
|
60
|
+
required(:token).filled(:string)
|
61
|
+
end
|
62
|
+
@header_schema = ::Dry::Schema.Params do
|
63
|
+
optional(:typ).filled(:string).value(eql?: 'JWT')
|
64
|
+
required(:alg).filled(:string).value(eql?: 'HS256')
|
65
|
+
required(:kid).filled(:string)
|
66
|
+
end
|
67
|
+
@payload_schema = ::Dry::Schema.Params do
|
68
|
+
required(:aud).filled(:string)
|
69
|
+
required(:iat).value(:integer, gt?: 0)
|
70
|
+
required(:sub).filled(:string)
|
71
|
+
optional(:data).filled(:hash)
|
72
|
+
end
|
73
|
+
super
|
74
|
+
freeze
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private_constant :APIVerifier_SingletonCache
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module JWTKit
|
5
|
+
module HandlingHelper
|
6
|
+
private
|
7
|
+
|
8
|
+
def_delegators :@controller,
|
9
|
+
:params,
|
10
|
+
:redirect_to,
|
11
|
+
:render
|
12
|
+
|
13
|
+
def initialize_helper(controller, payload, header = nil)
|
14
|
+
@controller = controller
|
15
|
+
@payload = payload
|
16
|
+
@header = header
|
17
|
+
end
|
18
|
+
|
19
|
+
def jwt_params(*permit)
|
20
|
+
@payload.fetch(:data, {}).slice(*permit)
|
21
|
+
end
|
22
|
+
|
23
|
+
def render_data(data_hash)
|
24
|
+
render json: {
|
25
|
+
data: data_hash,
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def render_exception(code, message = nil, metadata: nil)
|
30
|
+
render json: {
|
31
|
+
exception: {
|
32
|
+
code: code,
|
33
|
+
message: message.presence,
|
34
|
+
**{
|
35
|
+
metadata: metadata,
|
36
|
+
}.compact,
|
37
|
+
}.compact,
|
38
|
+
}, status: :unprocessable_entity
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module Mongoid
|
5
|
+
class Interactor
|
6
|
+
def initialize(
|
7
|
+
state_key:,
|
8
|
+
load_process:,
|
9
|
+
event_handler: nil,
|
10
|
+
mongoid_model: State
|
11
|
+
)
|
12
|
+
@state_key = state_key
|
13
|
+
@load_process = load_process
|
14
|
+
@event_handler = event_handler
|
15
|
+
@mongoid_model = mongoid_model
|
16
|
+
freeze
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(*commands)
|
20
|
+
lazy_key = @state_key.respond_to?(:call)
|
21
|
+
state_record = if lazy_key
|
22
|
+
@mongoid_model.new
|
23
|
+
else
|
24
|
+
@mongoid_model.where({
|
25
|
+
_id: @state_key,
|
26
|
+
}).first_or_initialize
|
27
|
+
end
|
28
|
+
process = @load_process.call(
|
29
|
+
state: state_record.state,
|
30
|
+
)
|
31
|
+
metadata_buffer = {
|
32
|
+
next_position: state_record.next_position,
|
33
|
+
}
|
34
|
+
pending_events = commands.each do |command|
|
35
|
+
process.call(command)
|
36
|
+
end.then do
|
37
|
+
process.pending_events
|
38
|
+
end
|
39
|
+
return pending_events unless pending_events.present?
|
40
|
+
state_record.state = process.state
|
41
|
+
state_record.next_position += pending_events.size
|
42
|
+
state_record._id = @state_key.call if lazy_key
|
43
|
+
begin
|
44
|
+
pending_events
|
45
|
+
ensure
|
46
|
+
if state_record.new_record?
|
47
|
+
begin
|
48
|
+
state_record.save!
|
49
|
+
rescue ::Mongo::Error::OperationFailure => e
|
50
|
+
raise e unless e.code == 11000 # E11000 duplicate key error
|
51
|
+
raise StaleRecord
|
52
|
+
end
|
53
|
+
else
|
54
|
+
update_result = @mongoid_model.where({
|
55
|
+
_id: state_record._id,
|
56
|
+
lock_version: state_record.lock_version,
|
57
|
+
}).update_all({
|
58
|
+
'$set': {
|
59
|
+
state: state_record.state,
|
60
|
+
next_position: state_record.next_position,
|
61
|
+
}.compact,
|
62
|
+
'$inc': {
|
63
|
+
lock_version: 1,
|
64
|
+
},
|
65
|
+
})
|
66
|
+
raise StaleRecord unless 0 < update_result.matched_count
|
67
|
+
end
|
68
|
+
metadata_buffer[:state_key] = state_record._id
|
69
|
+
@event_handler&.call(
|
70
|
+
pending_events,
|
71
|
+
**metadata_buffer,
|
72
|
+
)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module Mongoid
|
5
|
+
class State
|
6
|
+
include ::Mongoid::Document
|
7
|
+
store_in collection: 'process_states'
|
8
|
+
|
9
|
+
field :state, type: ::Hash, default: {}
|
10
|
+
field :next_position, type: ::Integer, default: 1
|
11
|
+
field :lock_version, type: ::Integer, default: 0
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySlime
|
4
|
+
module ProcessHelper
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
# alias for convenient access
|
8
|
+
class UnknownCommand < ::RubySlime::UnknownCommand
|
9
|
+
end
|
10
|
+
|
11
|
+
def state
|
12
|
+
@state ||= {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def pending_events
|
16
|
+
@pending_events ||= []
|
17
|
+
end
|
18
|
+
|
19
|
+
class_methods do
|
20
|
+
attr_reader :_event_handlers
|
21
|
+
|
22
|
+
private def on(event_class, &block)
|
23
|
+
@_event_handlers ||= {}
|
24
|
+
@_event_handlers[event_class] = block
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private def apply(*events)
|
29
|
+
handlers = self.class._event_handlers || {}
|
30
|
+
events.each do |event|
|
31
|
+
handler = handlers[event.class]
|
32
|
+
instance_exec(event, &handler) if handler
|
33
|
+
pending_events << event
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/ruby_slime.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_model'
|
4
|
+
require 'active_support'
|
5
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
6
|
+
require 'active_support/core_ext/object/blank'
|
7
|
+
require 'forwardable'
|
8
|
+
require 'singleton'
|
9
|
+
require 'zeitwerk'
|
10
|
+
|
11
|
+
loader = ::Zeitwerk::Loader.for_gem
|
12
|
+
loader.inflector.inflect(
|
13
|
+
'api_verifier' => 'APIVerifier',
|
14
|
+
'jwt_kit' => 'JWTKit',
|
15
|
+
)
|
16
|
+
loader.setup
|
17
|
+
|
18
|
+
module RubySlime
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby_slime
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sarun Rattanasiri
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-05-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
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: dry-schema
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jwt
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mongoid
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 7.3.2
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 7.3.2
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: zeitwerk
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description:
|
98
|
+
email: midnight_w@gmx.tw
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- LICENSE.md
|
104
|
+
- README.md
|
105
|
+
- lib/ruby_slime.rb
|
106
|
+
- lib/ruby_slime/command.rb
|
107
|
+
- lib/ruby_slime/concurrent_write_detected.rb
|
108
|
+
- lib/ruby_slime/event.rb
|
109
|
+
- lib/ruby_slime/event_dispatcher.rb
|
110
|
+
- lib/ruby_slime/event_queue.rb
|
111
|
+
- lib/ruby_slime/event_router.rb
|
112
|
+
- lib/ruby_slime/internals.rb
|
113
|
+
- lib/ruby_slime/internals/event_metadata_handler.rb
|
114
|
+
- lib/ruby_slime/jwt_kit.rb
|
115
|
+
- lib/ruby_slime/jwt_kit/api_verifier.rb
|
116
|
+
- lib/ruby_slime/jwt_kit/handling_helper.rb
|
117
|
+
- lib/ruby_slime/jwt_kit/token_error.rb
|
118
|
+
- lib/ruby_slime/mongoid.rb
|
119
|
+
- lib/ruby_slime/mongoid/interactor.rb
|
120
|
+
- lib/ruby_slime/mongoid/stale_record.rb
|
121
|
+
- lib/ruby_slime/mongoid/state.rb
|
122
|
+
- lib/ruby_slime/process_helper.rb
|
123
|
+
- lib/ruby_slime/schema_violation.rb
|
124
|
+
- lib/ruby_slime/unknown_command.rb
|
125
|
+
- lib/ruby_slime/version.rb
|
126
|
+
homepage: https://slime.systems/
|
127
|
+
licenses:
|
128
|
+
- BSD-3-Clause
|
129
|
+
metadata:
|
130
|
+
homepage_uri: https://slime.systems/
|
131
|
+
source_code_uri: https://gitlab.com/slime-systems/ruby-slime
|
132
|
+
post_install_message:
|
133
|
+
rdoc_options: []
|
134
|
+
require_paths:
|
135
|
+
- lib
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: 3.0.0
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
requirements: []
|
147
|
+
rubygems_version: 3.4.10
|
148
|
+
signing_key:
|
149
|
+
specification_version: 4
|
150
|
+
summary: The ruby-type slime made by Slime Systems.
|
151
|
+
test_files: []
|