Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions lib/resource_registry.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
require 'dry/transaction'
require 'dry/transaction/operation'
require 'dry/monads/result'
require 'system/boot'
require 'resource_registry/error'
require 'resource_registry/types'
require 'resource_registry/entities'
require 'resource_registry/services'
require 'resource_registry/stores'
require 'resource_registry/validations'
require File.expand_path(File.join(File.dirname(__FILE__), 'resource_registry/validations'))
require 'resource_registry/registries'
require 'resource_registry/serializers'
require 'resource_registry/version'
Expand All @@ -26,8 +27,11 @@ def configure
end

def load_options(dir)
Dir.glob(File.join(dir, "*")).each do |file_path|
ResourceRegistry::Services::LoadRegistryOptions.new.call(file_path)
files_to_load = Dir.glob(File.join(dir, "*")).to_a
files_to_load.inject(Dry::Monads::Success(:ok)) do |result, file_path|
result.bind do |_ignore|
ResourceRegistry::Services::LoadRegistryOptions.new.call(file_path)
end
end
end

Expand Down
4 changes: 0 additions & 4 deletions lib/resource_registry/entities.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
require 'dry-struct' unless defined?(Dry::Struct)
require 'resource_registry/types'
require 'resource_registry/entities/dry_struct_setters'
require 'resource_registry/entities/setting'
require 'resource_registry/entities/option'
require 'resource_registry/entities/registry'
require 'resource_registry/entities/core_options'
require 'resource_registry/entities/qualifying_life_event'
Expand Down
29 changes: 19 additions & 10 deletions lib/resource_registry/entities/option.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
require 'resource_registry/entities/setting'

module ResourceRegistry
module Entities
class Option < Dry::Struct
include Enumerable
include DryStructSetters

transform_keys(&:to_sym)
OptionConstructor = Types.Constructor("Option") { |val| Option.new(val) rescue nil }

# attribute :parent_namespace?, Types::Symbol
attribute :namespace?, Types::Symbol
attribute :key, Types::Symbol
class Option
extend Dry::Initializer
include Enumerable
option :namespace, type: Dry::Types["coercible.symbol"], optional: true
option :key, type: Dry::Types["coercible.symbol"], optional: true

# TODO: Make settings attribute dynamically typed
attribute :settings?, Types::Array.of(ResourceRegistry::Entities::Setting)
attribute :namespaces?, Types::Array.of(ResourceRegistry::Entities::Option)
option :settings, type: Dry::Types['coercible.array'].of(SettingConstructor), optional: true, default: -> { [] }
option :namespaces, Dry::Types['coercible.array'].of(OptionConstructor), optional: true, default: -> { [] }

def each
settings.each do |s|
yield s
end

namespaces.each do |ns|
yield ns
end
end
end
end
end
12 changes: 9 additions & 3 deletions lib/resource_registry/entities/registry.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
require 'resource_registry/entities/option'

module ResourceRegistry
module Entities
class Registry < Dry::Struct

# Configuration values
# Only let this be defined once, dry autoloading will
# try to continue loading this file and give us conflict
# issues.
unless defined?(Config)
attribute :config do
attribute :name, Types::Strict::String
attribute :root, Types::Strict::String
Expand All @@ -15,7 +21,7 @@ class Registry < Dry::Struct
# Dir, plus optional custom auto_register block
attribute :auto_register, Types::Array.of(Types::NilOrString) #| Types::Undefined
end

attribute :timestamp, Types::DateTime.default { DateTime.now }

# Persistence values
Expand All @@ -26,8 +32,8 @@ class Registry < Dry::Struct
end

# Override or additional attributes
attribute :options, ResourceRegistry::Entities::Option

attribute :options, Types::Constructor(ResourceRegistry::Entities::Option)
end
end
end
end
22 changes: 12 additions & 10 deletions lib/resource_registry/entities/setting.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
require 'resource_registry/entities/dry_struct_setters'

module ResourceRegistry
module Entities
class Setting < Dry::Struct
include DryStructSetters
transform_keys(&:to_sym)
class Setting
extend Dry::Initializer

attribute :key, Types::Symbol
attribute :title?, Types::String
attribute :description?, Types::String
attribute :type?, Types::Symbol
attribute :default?, Types::Any
attribute :value?, Types::Any

option :key, type: Dry::Types["coercible.symbol"]
option :title, type: Types::String, optional: true
option :description, type: Types::String, optional: true
option :type, type: Dry::Types["coercible.symbol"], optional: true
option :default, type: Types::Any, optional: true
option :value, type: Types::Any, optional: true
end

SettingConstructor = Types.Constructor(Setting) { |val| Setting.new(val) }
end
end
42 changes: 37 additions & 5 deletions lib/resource_registry/options/validation/option_contract.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,47 @@
require 'dry/validation'
require 'resource_registry/registries/validation/registry_contract'
require File.expand_path(File.join(File.dirname(__FILE__), "setting_contract"))

module ResourceRegistry
module Options
module Validation
class OptionContract < ResourceRegistry::Validation::ApplicationContract
unless defined?(MAX_OPTION_DEPTH)
MAX_OPTION_DEPTH = 15
end

class BottomNamespaceContract < ResourceRegistry::Validation::ApplicationContract
params do
required(:key).filled(Dry::Types["string"] | Dry::Types["symbol"])
optional(:settings).array(SettingContract.__schema__)
end
end

eval <<-RUBYCODE
class NamespaceLevel#{MAX_OPTION_DEPTH}Contract < ResourceRegistry::Validation::ApplicationContract
params do
required(:key).filled(Dry::Types["string"] | Dry::Types["symbol"])
optional(:settings).array(SettingContract.__schema__)
optional(:namespaces).array(BottomNamespaceContract.__schema__)
end
end
RUBYCODE

(1..(MAX_OPTION_DEPTH - 1)).to_a.reverse.each do |i|
eval(<<-RUBYCODE)
class NamespaceLevel#{i}Contract < ResourceRegistry::Validation::ApplicationContract
params do
required(:key).filled(Dry::Types["string"] | Dry::Types["symbol"])
optional(:settings).array(SettingContract.__schema__)
optional(:namespaces).array(NamespaceLevel#{i + 1}Contract.__schema__)
end
end
RUBYCODE
end

class OptionContract < ResourceRegistry::Validation::ApplicationContract
params do
required(:key).filled(:string)
optional(:settings).array(type?: SettingContract)
optional(:namespaces).array(type?: OptionContract)
required(:key).filled(Dry::Types["string"] | Dry::Types["symbol"])
optional(:settings).array(SettingContract.__schema__)
optional(:namespaces).array(NamespaceLevel1Contract.__schema__)
end
end
end
Expand Down
14 changes: 0 additions & 14 deletions lib/resource_registry/options/validation/option_schema.rb

This file was deleted.

8 changes: 4 additions & 4 deletions lib/resource_registry/options/validation/setting_contract.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ module Validation
class SettingContract < ResourceRegistry::Validation::ApplicationContract

params do
required(:key).filled(:symbol)
required(:default).filled(:string)
required(:key).filled(Dry::Types["string"] | Dry::Types["symbol"])
required(:default).filled(:any)
optional(:title).filled(:string)
optional(:description).filled(:string)
optional(:type).filled(:string)
optional(:value).filled(:string)
optional(:type).filled(Dry::Types["string"] | Dry::Types["symbol"])
optional(:value).filled(:any)
end

end
Expand Down
17 changes: 0 additions & 17 deletions lib/resource_registry/options/validation/setting_schema.rb

This file was deleted.

39 changes: 9 additions & 30 deletions lib/resource_registry/serializers/operations/generate_option.rb
Original file line number Diff line number Diff line change
@@ -1,42 +1,21 @@
require File.expand_path(File.join(File.dirname(__FILE__), "../..", "options/validation/option_contract"))

module ResourceRegistry
module Serializers
module Operations
class GenerateOption

include Dry::Transaction::Operation

def call(input)
option = convert(result: input)
return Success(option)
end

private

# def convert(input: nil)
# input.symbolize_keys!

# ResourceRegistry::Entities::Option.new(input)
# end

def convert(result: nil, parent_node: nil)
result.symbolize_keys!
if result.keys.include?(:namespaces) || result.keys.include?(:settings)
options = ResourceRegistry::Entities::Option.new(key: result[:key].to_sym)
root = options if parent_node.blank?
parent_node.namespaces = parent_node.namespaces.to_a + [options] if parent_node.present?
[:namespaces, :settings].each do |attrs|
result[attrs].each {|element| convert(result: element, parent_node: options) } if result[attrs].present?
end
schema = schema = ResourceRegistry::Options::Validation::OptionContract.new
result = schema.call(input)

if result.success?
option = ResourceRegistry::Entities::Option.new(result.to_h)
Success(option)
else
result.tap do |attrs|
attrs[:key] = attrs[:key].to_sym
attrs[:default] = attrs[:default]
attrs[:value] = attrs[:value] if attrs[:value].present?
end
setting = ResourceRegistry::Entities::Setting.new(result)
parent_node.settings = parent_node.settings.to_a + [setting]
Failure(result.errors)
end
root
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/resource_registry/serializers/operations/parse_yaml.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ParseYaml
include Dry::Transaction::Operation

def call(input)
return Success(YAML.load(input))
Success(YAML.load(input))
end
end
end
Expand Down
Loading