*Priority levels: Low, Medium, High, Critical, Unknown.
*Complexity levels: Easy, Moderate, Hard, Extreme, Unknown.
*Different naming conventions for priority and complexity are used intentionally to simplify task lookup.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | High | TODO | docs, user-docs |
Describe every available Conveninet Service feature at least once.
Notes:
-
This is a crucial task before the v1.0.0 release.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Easy | TODO | yard, yard-tags, api-docs |
Ensure YARD type signatures are properly rendered in the Convenient Service API docs.
Notes:
-
This is a crucial task before the v1.0.0 release.
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Easy | TODO | id-or-record, attributes |
Notes:
Once the first major version is released, add Convenient Service to the Ruby Toolbox Catalogue.
Open a PR that modifies the following file.
Priority | Complexity | Status | Tags |
---|---|---|---|
High | Medium | TODO | stub-entry, rspec-matcher |
stub_entry(SomeFeature, :some_entry)
.with_arguments(*args, **kwargs, &block)
.to return_value(:some_value)
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Easy | TODO | inputs, short-syntax |
# before
step SuccessService,
in: [
{nesting_level: raw(nesting_level)},
{index: index}
],
out: :id
# after
step SuccessService,
in: {
nesting_level: raw(nesting_level),
index: index
},
out: :id
Notes:
- This is a crucial task before the v1.0.0 release.
Priority | Complexity | Status | Tags |
---|---|---|---|
High | Easy | TODO | include-config, rspec-matcher |
it { is_expected.to include_config(ConvenientService::Standard::Config) }
Notes:
- This is a crucial task before the v1.0.0 release.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | clean-backtrace |
Priority | Complexity | Status | Tags |
---|---|---|---|
High | Moderate | TODO | respond_to, pattern-matching |
For example:
# before
result = Service.result(number: 4)
if result.success?
# ...
elsif result.failure?
if result.code.to_sym == :baz
# ...
elsif result.code.to_sym == :qux
# ...
end
else # result.error?
if result.code.to_sym == :foo
# ...
elsif result.code.to_sym == :bar
# ...
end
end
# after
result = Service.result(number: 4)
result.respond_to do |status|
status.success { }
status.failure(code: :baz) { }
status.failure(code: :qux) { }
status.error(code: :foo) { }
status.error(code: :bar) { }
status.unexpected { }
end
Notes:
- This is a crucial task before the v1.0.0 release.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | per-request-cache, cached-steps, current-attributes |
A killer feature.
Notes:
Priority | Complexity | Status | Tags |
---|---|---|---|
High | Extreme | TODO | concurent-steps, parallel-steps |
A killer feature.
Priority | Complexity | Status | Tags |
---|---|---|---|
High | Extreme | TODO | recoverable-services |
A killer feature.
Priority | Complexity | Status | Tags |
---|---|---|---|
Moderate | Extreme | TODO | results-enumerator |
enum = service.to_results_enum.lazy.select { ... }
result = enum.next
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Moderate | TODO | hereredoc, failures, errors |
Notes:
- Check receive counts from RSpec.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Hard | TODO | high-order-services |
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Moderate | TODO | delegate-to-service |
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Moderate | TODO | and_return, rspec-argument-matcher |
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Moderate | TODO | delegate_to, diff_algorithm, diffy |
ConvenientService::Config.delegate_to_diff_algorithm = :diffy
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Hard | TODO | rubocop-cop, service-name, start-with-verb |
Priority | Complexity | Status | Tags |
---|---|---|---|
High | Hard | TODO | generator, specs-boilerplate |
A killer feature.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | rubocop-cop, missing-direct-specs |
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | inline-steps |
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Moderate | TODO | public, protected, private, method-middleware-caller |
Priority | Complexity | Status | Tags |
---|---|---|---|
High | High | TODO | config, uninclude |
For example:
class Service
include ConvenientService::Standard::Config
include ConvenientService::FaultTolerance::Config
uninclude ConvenientService::FaultTolerance::Config
def result
success
end
end
Otherwise, the config inclusion API must be changed before v1.0.0.
Notes:
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Moderate | TODO | positional-arguments, steps |
For example:
class Service
include ConvenientService::Standard::Config
step NestedService, in: [
{0 => :foo},
{1 => :bar}
]
end
Under the hood it is converted into:
def first_step
@first_step ||= NestedService.result(foo, bar)
end
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | minitest, assertions, matchers |
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | performance-optimization, CachesReturnValue |
Services and steps are caching their results utilizing the CachesReturnValue
plugin.
Although it is very flexible and easy to reuse from a maintenance point of view, that is not the best option from a performance point of view.
If it starts to cause any visible performance penalty, it can be refactored using regular ||=
or if defined?
.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | parent-result |
Fallbacks have no access to their original results.
When a fallback result is used, the original result is NOT in the parent's chain.
Is it OK?
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Easy | TODO | result-code, case-when, symbol-descendant |
This way the code below:
if result.not_success?
case result.code.to_sym
when :full_queue
notify_devops
when :duplicated_job
notify_devs
else
# ...
end
end
Can be rewritten as follows:
if result.not_success?
case result.code
when :full_queue
notify_devops
when :duplicated_job
notify_devs
else
# ...
end
end
That leads to more idiomatic and natural Ruby.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | config, method-missing, auto-commit |
The TooManyCommitsFromMethodMissing
exception is already beneficial.
##
# `Service` config is committed too many times from `method_missing`.
# In order to resolve this issue try to commit it manually before usage of any config-dependent method.
#
# Example 1 (outside class):
# # Commitment:
# Service.commit_config!
#
# # Few lines later - usage:
# Service.result # or whatever method.
#
# Example 2 (inside class):
#
# class Service
# # ...
# commit_config!
#
# step :result # or any other method that becomes available after config commitment.
# end
However, it does not give any information on which exact method causes too many method-missing invocations.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | internals, core |
Notes:
- Provide a simple way to add new instance/class methods to internals.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Hard | TODO | core, auto-commitment |
Notes:
-
Ensure it can be easily integrated with other extractions, e,g: new middleware backend.
-
Probably inheritance is a compromise way to go for now.
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Low | TODO | specification, gemspec, singleton |
-
That is required to have a simple way to test the
gemspec
by RSpec.For example, the
spec.files
config is very error-prone, but it has no reliable specs for now.module ConvenientService class Specification include ::Singleton # ... def to_gemspec # ... end end end
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Moderate | TODO | truffle-ruby, dockerfile |
Notes:
-
Consider to add TruffleRuby to CI.
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | Unknown | TODO | go-task, Taskfile, leading-env-variable, trailing-env-variable |
The following command (task docker:build
) works in both cases.
With leading ENV variables.
RUBY_ENGINE=ruby RUBY_VERSION=2.7 task docker:build
With trailing ENV variables.
task docker:build RUBY_ENGINE=ruby RUBY_VERSION=2.7
But at the same timetask rspec
works only with leading ENV variables.
APPRAISAL=rails_7.0 task rspec
That is happening because task rspec
accesses APPRAISAL
using Dynamic Variables.
Notes:
- Consider to open a Github issue.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Hard | TODO | request-store |
Use RequestStore or RequestStore::Fibers when available? | Any additional changes for RequestStore::Sidekiq? Check RuboCop::ThreadSafety for details.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | layers |
See Components Diagram + it should take the minimal amount of efforts to extract and reuse Utils
, Suppport
in the different projects.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Easy | TODO | warning, specs |
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | High | TODO | internals, callbacks, steps |
In order to NOT pollute the public interface of users services.
Priority | Complexity | Status | Tags |
---|---|---|---|
High | Hard | TODO | logger, custom-matcher |
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Easy | TODO | dependency-containers |
Ensure same order of attr macros, delegators, initialize, class methods, attr methods, queries, actions, to_*
, comparison, inspect
To abstract away block&.source_location != other.block&.source_location
To hide overriden eql?
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Hard | TODO | thread-safety |
rspec-benchmark, Testing object allocations, allocation_stats.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | performance, deeply-nested-steps |
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | performance, included-modules |
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | middleware-backend |
Consider to extract common benchmark setup.
Priority | Complexity | Status | Tags |
---|---|---|---|
Low | High | TODO | memory, drop-calculated-steps |
Drawbacks:
- Services that do NOT keep references to already calculated steps can NOT utilize
CanHaveRollbacks
plugin.
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | High | TODO | compile, middleware-stack |
module ConvenientService
module Support
module Middleware
class StackBuilder
module Constants
module Backends
##
# @return [Symbol]
#
COMPILED = :compiled
end
end
end
end
end
end
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | Moderate | TODO | middleware-backend, interface |
def run(env, original)
# ...
end
Priority | Complexity | Status | Tags |
---|---|---|---|
Medium | High | TODO | cache, config |
-
Commercial Support docs. See Sidekiq Commercial Support.
-
Acknowledgements - Government End Users. See GraphQL Ruby Commercial Licence.
-
Applicable Law and Jurisdiction (Miscellaneous - Governing Law). See Kiba Applicable Law and Jurisdiction.
-
Contact email
info@convenientservice.org
. -
Contributing Guide. See Sidekiq Contributing.
Search for TODO
s in the codebase or check discussions for more tasks.