Class: ConvenientService::Core::Entities::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/convenient_service/core/entities/config.rb,
lib/convenient_service/core/entities/config/exceptions.rb,
lib/convenient_service/core/entities/config/entities/concerns.rb,
lib/convenient_service/core/entities/config/commands/find_entity_class.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares.rb,
lib/convenient_service/core/entities/config/commands/create_entity_class.rb,
lib/convenient_service/core/entities/config/entities/concerns/entities/stack.rb,
lib/convenient_service/core/entities/config/commands/find_or_create_entity_class.rb,
lib/convenient_service/core/entities/config/entities/concerns/entities/middleware.rb,
lib/convenient_service/core/entities/config/entities/concerns/entities/default_concern.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/stack.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller.rb,
lib/convenient_service/core/entities/config/commands/track_method_missing_commit_trigger.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/concern.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/constants.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/concern.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/chain.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/commands/generate_stack_name.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/classic.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middleware_creators/base.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middleware_creators/with.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base/concern.rb,
lib/convenient_service/core/entities/config/entities/concerns/entities/middleware/commands/cast_middleware.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/chain/concern.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base/constants.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/cast_caller.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/concern/class_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middleware_creators/observable.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/concern/instance_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/concern/class_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/commands/cast_container.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/concern/instance_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/define_method_callers.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base/concern/class_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/undefine_method_callers.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/chain/concern/class_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/chain/entities/method_chain.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base/structs/intended_method.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/chain/commands/normalize_env.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base/concern/instance_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/chain/concern/instance_methods.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middleware_creators/observable/entities/event.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/commands/resolve_methods_middlewares_callers.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base/commands/create_observable_middleware.rb,
lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/chain/commands/create_observable_middleware.rb

Defined Under Namespace

Modules: Commands, Entities, Exceptions

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass:) ⇒ void

Parameters:

  • klass (Class)


32
33
34
35
36
37
38
39
# File 'lib/convenient_service/core/entities/config.rb', line 32

def initialize(klass:)
  @klass = klass

  ##
  # IMPORTANT: Intentionally initializes `lock` in constructor to ensure thread-safety.
  #
  @lock = ::Mutex.new
end

Instance Attribute Details

#klassObject (readonly)

Returns the value of attribute klass.



20
21
22
# File 'lib/convenient_service/core/entities/config.rb', line 20

def klass
  @klass
end

#lockObject (readonly)

Returns the value of attribute lock.



26
27
28
# File 'lib/convenient_service/core/entities/config.rb', line 26

def lock
  @lock
end

Instance Method Details

#commit!(trigger: Constants::Triggers::USER) ⇒ Boolean

Commits config when called for the first time. Does nothing for the subsequent calls.

Parameters:

Returns:

  • (Boolean)

    true if called for the first time, false otherwise (similarly as Kernel#require).

See Also:



205
206
207
208
# File 'lib/convenient_service/core/entities/config.rb', line 205

def commit!(trigger: Constants::Triggers::USER)
  (committed? ? false : concerns.include!)
    .tap { Commands::TrackMethodMissingCommitTrigger.call(config: self, trigger: trigger) }
end

#committed?Boolean

Returns:

  • (Boolean)


186
187
188
# File 'lib/convenient_service/core/entities/config.rb', line 186

def committed?
  @committed ||= concerns.included?
end

#concernsConvenientService::Core::Entities::Config::Entities::Concerns #concerns(&configuration_block) ⇒ ConvenientService::Core::Entities::Config::Entities::Concerns

Sets or gets concerns for a service class.

Examples:

Getter

concerns

Setter

concerns(&configuration_block)

Overloads:



60
61
62
63
64
65
66
67
68
69
# File 'lib/convenient_service/core/entities/config.rb', line 60

def concerns(&configuration_block)
  if configuration_block
    assert_not_committed!

    @concerns ||= Entities::Concerns.new(klass: klass)
    @concerns.configure(&configuration_block)
  end

  @concerns || Entities::Concerns.new(klass: klass)
end

#entity(name, &configuration_block) ⇒ Class?

This method is intended to be used only inside config included blocks.

Parameters:

  • name (Symbol)
  • configuration_block (Proc, nil)

Returns:

  • (Class, nil)


154
155
156
157
158
159
160
161
162
163
164
# File 'lib/convenient_service/core/entities/config.rb', line 154

def entity(name, &configuration_block)
  return Commands::FindEntityClass.call(config: self, name: name) unless configuration_block

  assert_not_committed!

  entity_class = Commands::FindOrCreateEntityClass.call(config: self, name: name)

  entity_class.class_exec(&configuration_block)

  entity_class
end

#method_missing_commits_counterConvenientService::Support::ThreadSafeCounter



169
170
171
# File 'lib/convenient_service/core/entities/config.rb', line 169

def method_missing_commits_counter
  @method_missing_commits_counter ||= Support::ThreadSafeCounter.new(max_value: Constants::Commits::METHOD_MISSING_MAX_TRIES)
end

#middlewares(method) ⇒ Hash{Symbol => Hash{Symbol => ConvenientService::Core::Entities::Config::Entities::MethodMiddlewares}} #middlewares(method, scope: ) ⇒ Hash{Symbol => Hash{Symbol => ConvenientService::Core::Entities::Config::Entities::MethodMiddlewares}} #middlewares(method, &configuration_block) ⇒ ConvenientService::Core::Entities::Config::Entities::MethodMiddlewares #middlewares(method, scope: , &configuration_block) ⇒ ConvenientService::Core::Entities::Config::Entities::MethodMiddlewares

Sets or gets middlewares for a service class.

Examples:

Getters

middlewares(:result)
middlewares(:result, scope: :instance)
middlewares(:result, scope: :class)

Setters

middlewares(:result, &configuration_block)
middlewares(:result, scope: :instance, &configuration_block)
middlewares(:result, scope: :class, &configuration_block)

Overloads:



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/convenient_service/core/entities/config.rb', line 110

def middlewares(method, scope: :instance, &configuration_block)
  @middlewares ||= Support::Cache.backed_by(:hash).new

  scoped_middlewares = @middlewares.scope(scope)
  method_middlewares = scoped_middlewares.get(method) || Entities::MethodMiddlewares.new(scope: scope, method: method, klass: klass)

  return method_middlewares unless configuration_block

  assert_not_committed!

  method_middlewares.configure(&configuration_block)

  if method_middlewares.any?
    method_middlewares.define!

    scoped_middlewares.set(method, method_middlewares)
  else
    method_middlewares.undefine!

    scoped_middlewares.delete(method)
  end

  method_middlewares
end

#optionsConvenientService::Config::Entities::Options

This method is intended to be used only inside config included blocks.



143
144
145
# File 'lib/convenient_service/core/entities/config.rb', line 143

def options
  @options ||= Utils.safe_send(klass, :namespace)&.__convenient_service_config__&.options || ConvenientService::Config::Entities::Options.new
end